Как преобразовать эти шейдеры OpenGL в шейдеры OpenGL ES для GLES3 для Android NDK?
Следующие шейдеры терпят неудачу с возвратом -1, когда я пытаюсь.
col_attr = glGetAttribLocation(prog, "v_col");
я пробовал разные настройки, включая переключение,
gl_FragColor
в
outColor
а также
#version 300 es
в
#version 150 core
и многое другое, прежде чем я понял, что я полностью потерян, и есть так много переменных, которые я не знаю. Мне просто нужны эти простые шейдеры, преобразованные во что-то, что работает с GLESv3 для Android NDK в C++. Вся помощь высоко ценится. Спасибо.
Оригинальный вершинный шейдер
#version 150 core
in vec3 v_pos;
in vec4 v_col;
out vec4 color;
uniform mat4 projection;
uniform mat4 view;
void main(){
color = v_col;
gl_Position = projection * view * vec4(v_pos, 1.0);
}
Оригинальный фрагментный шейдер
#version 150 core
in vec4 color;
void main(){
gl_FragColor = color;
}
Обновление: Обнаружено, что при компиляции происходит сбой только шейдера фрагмента.
Новый вершинный шейдер - компилируется!
return "#version 300 es \n"
"in vec3 v_pos; \n"
"in vec4 v_col; \n"
"out vec4 color; \n"
"uniform mat4 projection; \n"
"uniform mat4 view; \n"
"void main() \n"
"{ \n"
" color = v_col; \n"
" gl_Position = projection * view * vec4(v_pos, 1.0); \n"
"} \n";
Новый шейдер фрагментов - не компилируется!
return "#version 300 es \n"
"in vec4 color; \n"
"out vec4 outColor; \n"
"void main() \n"
"{ \n"
" outColor = color; \n"
"} \n";
Новый шейдер фрагментов - компилируется!
return "#version 300 es \n"
"precision mediump float; \n"
"in vec4 color; \n"
"out vec4 outColor; \n"
"void main() \n"
"{ \n"
" outColor = color; \n"
"} \n";
1 ответ
Вы должны объявить выходную переменную фрагмента шейдера out vec4 outColor
,
Далее вы должны добавить прецизионный квалификатор:
Действительный фрагментный шейдер GLSL ES 3.00 будет:
#version 300 es
precision mediump float;
in vec4 color;
out vec4 outColor;
void main(){
outColor = color;
}
Информация о версии (#version 300 es
) также необходимо изменить в вершинном шейдере.
См. Спецификация OpenGL ES Shading Language 3.00 - 4.3.6 Выходные переменные, страница 42:
Фрагмент выходных данных объявляется как в следующих примерах:
out vec4 FragmentColor; out uint Luminosity;
См. Спецификацию OpenGL ES Shading Language 3.00 - 4.5.4 Стандартные прецизионные классификаторы, стр. 56:
Язык фрагментов не имеет квалификатора точности по умолчанию для типов с плавающей запятой. Отсюда для
float
, объявления переменных вектора и матрицы с плавающей запятой, либо объявление должно включать прецизионный прецизионный метод, либо точность с плавающей запятой по умолчанию должна быть объявлена ранее.