когда я переключаюсь на использование OpenGL ES 3 с GLSL 300, я обнаружил следующую ошибку в своем шейдере фрагментов
необъявленный идентификатор gl_FragColor
при использовании GLSL 100 все нормально.
когда я переключаюсь на использование OpenGL ES 3 с GLSL 300, я обнаружил следующую ошибку в своем шейдере фрагментов
необъявленный идентификатор gl_FragColor
при использовании GLSL 100 все нормально.
Современные версии 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.
fragColor
является выходной переменной? Что делать, если у меня есть несколько выходов??
- person mackycheese21; 15.05.2018
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. Причина отсутствия предопределенного вывода фрагментного шейдера заключается в том, что он плохо масштабируется для нескольких целей рендеринга и для целей рендеринга, которым требуются типы, отличные от векторов с плавающей запятой.