为什么我不能知道GLSL中OpenGL灯的状态?

时间:2009-06-03 19:20:10

标签: opengl shader glsl

有没有办法找出GLSL中是否启用了不涉及传递属性或创建大量不同着色器的灯光?

使用NVidia的C for Graphics(Cg)怎么样?我可以用Cg做到吗?

我现在确信你不能这样做。但现在我问:为什么不呢?

4 个答案:

答案 0 :(得分:6)

根据我对GLSL Common Mistakes的“启用或不启用”部分的理解,这是一个哲学原因:着色器被编写为覆盖固定管道,因此它们不应该依赖于固定的管道状态。您必须为所需的每种功能使用不同的着色器。

另外我猜这可能是一个设计选择,因为GPU上的分支很贵,有人必须认为你不应该做像

这样的事情。
if (gl_LightSource[0].enabled)
{ ... }
首先是

答案 1 :(得分:3)

unforgiven3是对的 - GLSL不提供对固定管道启用状态的访问。你必须把它作为制服传递。

答案 2 :(得分:1)

如果GLSL类似于HLSL(DirectX的等价物),我怀疑它是,我认为你坚持传递属性。

: - (

答案 3 :(得分:0)

您可以将灯光颜色设置为(0,0,0,0)并在其上进行分支,或者让它循环显示现在没有贡献的灯光。