2016-05-13 3 views
1

фрагмент шейдера в AMD OpenGL ES SDK for 3.1 (по состоянию на 5/13/2016) заключается в следующем:Проблемы с AMD OpenGL ES SDK 3.1 Фрагмент шейдеров

precision highp float; 
uniform vec4 lightVec; 
uniform sampler2D textureUnit0; 
varying vec2 vTexCoord; 
varying vec3 vNormal; 
void main() 
{ 
    vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1); 
    gl_FragColor = diff * texture(textureUnit0, vTexCoord); 
} 

Который утончаются неправильно. Ближайший я получил к исправлению это:

precision highp float; 
uniform vec4 lightVec; 
uniform sampler2D textureUnit0; 
varying vec2 vTexCoord; 
varying vec3 vNormal; 
void main() 
{ 
    vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1); 
    gl_FragColor = diff * texture2D(textureUnit0, vTexCoord); 
} 

Который поворачивался текстуру в Texture2D на последней строке.

Не знаю, что происходит с попыткой вычислить диффузный шейдер. Он использует dot, чтобы получить поплавок и вызов swizzle (я думаю, это то, что вы называете оператором .xxx) на поплавке, чтобы попытаться его дублировать?

Как кто-то легко узнает больше о шейдерах? Кажется, очень сложная область, чтобы стать квалифицированным.

+0

Исходный код затенения не «утончаются неправильно». Это просто отсутствует директива версии. Поскольку вы пытаетесь использовать ES 3.1, он должен иметь '#version 310 es' в качестве первой строки. Без директивы версии по умолчанию используется версия 100, соответствующая ES 2.0, для которой требуется старая функция выборки текстуры. –

ответ

0

Вы говорите, что эта линия:

vec4 diff = vec4(dot(lightVec.xyz,normalize(vNormal)).xxx, 1); 

не компилируется из-за Swizzle на результате точки? Попробуйте:

float fDot = dot(lightVec.xyz,normalize(vNormal)); 
vec4 diff = vec4(fDot, fDot, fDot, 1); 

Что касается обучения писать шейдеры лучше, я бы искать на учебники на любой вкус GLSL и посмотреть, если вы можете найти тот, который вы хотите, настольные версии отличаются, но не что разные , и вы сможете найти лучший учебник, если вы не ограничите свой поиск одной конкретной версией.

Затем вооружитесь спецификацией GLSLES 3.1, чтобы вы могли ссылаться на все, что вы не понимаете/не можете перевести на выбранный вами диалект. И получите инструменты шейдера PowerVR или что-то подобное, что позволяет вам вводить код шейдера и получать мгновенную обратную связь о том, компилируется ли он и сколько циклов он принимает.

0

Использование функции texture() для правильного отображения текстур действительно правильно для шейдера ES 3.1. Функция texture2D() использовалась в версии GLSL, которая сочетается с ES 2.0, но не с текущими версиями.

Причина, по которой вам пришлось изменить это, заключается в том, что в вашем шейдерном коде отсутствует директива по версии. Он должен иметь это в первой строке, если вы на самом деле хотите использовать ES 3.1 функции в коде шейдера:

#version 310 es 

Шейдер является недействительным, однако. Официальное название для .xxx в шейдерном коде - оператор выбора компонентов. Это относится только к векторам, которые четко прописаны в GLSL ES 3.10 спецификации:

Обратите внимание, что скаляры не считается однокомпонентными векторами и, следовательно, использование составных операторов отбора на скалярах является незаконным.

Функция dot() возвращает поплавок, который является скалярным значением.Так эта конструкция не является действительным:

dot(...).xxx 

Самый элегантный (ИМХО) способ перезаписи, что линия правильно это:

vec4 diff = vec4(vec3(dot(lightVec.xyz, normalize(vNormal))), 1.0);