有没有办法找出GLSL中是否启用了不涉及传递属性或创建大量不同着色器的灯光?
使用NVidia的C for Graphics(Cg)怎么样?我可以用Cg做到吗?
我现在确信你不能这样做。但现在我问:为什么不呢?
答案 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)并在其上进行分支,或者让它循环显示现在没有贡献的灯光。