#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);