Как преобразовать эти шейдеры 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, объявления переменных вектора и матрицы с плавающей запятой, либо объявление должно включать прецизионный прецизионный метод, либо точность с плавающей запятой по умолчанию должна быть объявлена ​​ранее.

Другие вопросы по тегам