При переходе на GLSL 300 встретил следующую ошибку

когда я переключаюсь на использование OpenGL ES 3 с GLSL 300, я обнаружил следующую ошибку в своем шейдере фрагментов

необъявленный идентификатор gl_FragColor

при использовании GLSL 100 все нормально.


person Adam Lee    schedule 02.11.2014    source источник


Ответы (2)


Современные версии GLSL выполняют выходные данные фрагментного шейдера, просто объявляя их как значения out, а gl_FragColor больше не поддерживаются, отсюда и ваша ошибка. Попробуй это:

out vec4 fragColor;
void main()
{
    fragColor = vec4(1.0, 0.0, 0.0, 1.0);
}

Обратите внимание, что gl_FragDepth не изменился и по-прежнему доступен.

Для получения дополнительной информации см. https://www.opengl.org/wiki/Fragment_Shader.

person Richard Viney    schedule 02.11.2014
comment
Как сообщить OpenGL, что fragColor является выходной переменной? Что делать, если у меня есть несколько выходов?? - person mackycheese21; 15.05.2018
comment
При использовании GL_draw_buffers вышеуказанное станет gl_FragData[0] = ... вместе с соответствующей настройкой/привязкой буфера отрисовки в другом месте. - person Richard Viney; 05.08.2018

Предопределенная переменная gl_FragColor больше не существует в GLSL ES 3.00. Вам нужно определить свою собственную переменную out для вывода фрагментного шейдера. Вы можете использовать любое имя, например:

out vec4 FragColor;

void main() {
    ...
    FragColor = ...;
}

Это соответствует основному профилю полного OpenGL. Причина отсутствия предопределенного вывода фрагментного шейдера заключается в том, что он плохо масштабируется для нескольких целей рендеринга и для целей рендеринга, которым требуются типы, отличные от векторов с плавающей запятой.

person Reto Koradi    schedule 02.11.2014