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
,但我觉得提前退出会使代码更具可读性。除了糟糕的风格外,它还必须起作用。