Как преобразовать эти шейдеры OpenGL в шейдеры OpenGL ES для GLES3 для Android NDK? - PullRequest
0 голосов
/ 02 марта 2019

Следующие шейдеры завершаются с ошибкой с возвратом -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 Ответ

0 голосов
/ 02 марта 2019

Вы должны объявить вывод фрагмента шейдера переменная 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 3.00 Спецификация - 4.3.6 Выходные переменные стр. 42:

Вывод фрагментов объявляется, как в следующих примерах:

out vec4 FragmentColor;
out uint Luminosity;

См. Язык шейдинга OpenGL ES 3.00 Спецификация - 4.5.4 Стандартные квалификаторы точности стр. 56:

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

...