当切换到GLSL 300时,遇到了以下错误。

12

当我切换到使用OpenGL ES 3和GLSL 300时,我的片元着色器遇到了以下错误

未声明标识符gl_FragColor

当使用GLSL 100时,一切正常。

2个回答

28

现代版本的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

2
我该如何告诉OpenGL,fragColor是输出变量呢?如果我有多个输出怎么办? - mackycheese21
当使用GL_draw_buffers时,上述内容将变为gl_FragData[0] = ...,同时需要在其他地方进行适当的绘制缓冲设置/绑定。 - Richard Viney

8

在GLSL ES 3.00中,预定义变量gl_FragColor已经不存在了。您需要为片段着色器的输出定义自己的out变量。您可以使用任何名称,例如:

out vec4 FragColor;

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

这遵循完整OpenGL的核心配置文件。没有预定义的片段着色器输出的原因是它在多个渲染目标和需要除浮点向量之外的类型的渲染目标上扩展性不好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接