Необъявленный идентификатор текстуры в OpenGL es

#opengl-es #glsl

Вопрос:

Я пытаюсь скомпилировать этот шейдер:

 varying vec2 TexCoords;
varying vec4 color;

uniform sampler2D text;
uniform vec3 textColor;

void main()
{    
    vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);
    color = vec4(textColor, 1.0) * sampled;
}
 

Это для OpenGL es. Ошибки, которые я получаю:

 ERROR: 0:2: 'vec2' : No precision defined for this type
ERROR: 0:3: 'vec4' : No precision defined for this type
ERROR: 0:6: 'vec3' : No precision defined for this type
ERROR: 0:10: 'texture' : undeclared identifier
ERROR: 0:10: invalid function call
 

Обратите внимание, что он компилируется в OpenGL 3.3, но не работает в es.

Ответ №1:

См. Спецификацию OpenGL ES Язык затенения 1.00 — 4.5.3 Квалификаторы точности по умолчанию:

Язык фрагментов не имеет квалификатора точности по умолчанию для типов с плавающей запятой. Следовательно, для объявлений переменных с плавающей запятой, вектора с плавающей запятой и матрицы либо объявление должно включать квалификатор точности, либо точность с плавающей запятой по умолчанию должна быть объявлена ранее.

Поэтому вы должны добавить квалификатор точности. например:

 precision mediump float;
 

Перегруженный функционал texture был представлен в GLSL ES 3.00, но он не поддерживается в GLSL ES 1.00. Вы должны использовать функцию texture2D :

vec4 sampled = vec4(1.0, 1.0, 1.0, texture(text, TexCoords).r);

 vec4 sampled = vec4(1.0, 1.0, 1.0, texture2D(text, TexCoords).r);