Opengl 为什么GLSL忽略返回?

Opengl 为什么GLSL忽略返回?,opengl,glsl,Opengl,Glsl,我的像素着色器行为不正常,调试后,我使用了以下像素着色器: #version 400 void main(){ gl_FragColor = vec4(1., 0., 0., 1.); return; gl_FragColor.r = max(gl_FragColor.r, 0.); } 结果是黑屏。如果我注释掉最后一行gl_FragColor.r=max(gl_FragColor.r,0.)然后我得到一个红色屏幕。为什么第一个版本会出现黑屏而不是预期的红屏 我通读了这

我的像素着色器行为不正常,调试后,我使用了以下像素着色器:

#version 400
void main(){
    gl_FragColor = vec4(1., 0., 0., 1.);
    return;
    gl_FragColor.r = max(gl_FragColor.r, 0.);
}
结果是黑屏。如果我注释掉最后一行
gl_FragColor.r=max(gl_FragColor.r,0.)然后我得到一个红色屏幕。为什么第一个版本会出现黑屏而不是预期的红屏

我通读了这本书,它显然允许提前归还。 我使用的是Intel HD Graphics 4000

编辑:我怀疑GLSL对版本和弃用的变量(如
gl\u FragColor
)感到困惑,因此我做了以下更改:

#version 330
out vec4 FragColor;
void main(){
    FragColor = vec4(1., 0., 0., 1.);
    return;
    FragColor.r = FragColor.r;
}
<>我也在我的C++程序中添加了(希望)适当的绑定:
glBindFragDataLocation(像素着色器,0,“FragColor”)

同样的效果也会发生: 我有一个黑屏。如果我删除
返回后的行
,我会看到一个红色屏幕

编辑:根据请求顶点着色器:

//#version 330
void main(){
    gl_Position = gl_Vertex;
}

我还没有设法使它在启用3.3版的情况下工作。

它原来是一个着色器编译器错误。图形驱动程序的更新解决了该问题。

链接时有错误吗?@ratchetfreak我没有收到链接错误或警告。您在那里显示的着色器在我的机器上工作正常。主函数内的返回是值得的。glSlang引用编译器不提供任何编译错误。在图形驱动程序方面,OpenGL的支持会不会太草率?你可以发布你正在使用的顶点着色器吗(然后我可以在我这边做更多的测试)?@Bartvbl我在问题中添加了顶点着色器。可能是因为版本不同而存在问题?我最近只是添加了一些版本来解决这个问题。@AbstractAlgorithm这是一个显示错误的最小示例。原始代码更有意义,并以一种有用的方式使用
return
。我可以使用
if
子句来替换
return
,但我觉得提前退出会使代码更具可读性。除了糟糕的风格外,它还必须起作用。