有没有办法找出是否在 GLSL 中启用了不涉及传递属性或创建大量不同着色器的灯光?
使用 NVidia 的 C for Graphics (Cg) 怎么样?我可以用 Cg 做吗?
我现在确信你做不到。但现在我问:为什么不呢?
根据我对GLSL 常见错误的“启用或不启用”部分的理解,这是一个哲学原因:着色器是为覆盖固定管道而编写的,因此它们不应该依赖于固定的管道状态。您必须为所需的每种功能使用不同的着色器。
另外我想这可能是一个设计选择,因为分支在 GPU 上很昂贵,而且有人一定认为你不应该做类似的事情
if (gl_LightSource[0].enabled)
{ ... }
首先。
unforgiven3 是对的——GLSL 不提供对固定管道启用状态的访问。您必须将其作为制服传递。
如果 GLSL 类似于 HLSL(DirectX 的等价物),我怀疑是这样,我认为您会被传递属性所困扰。
:-(
您可以将灯光颜色设置为 (0,0,0,0) 并在其上进行分支,或者让它在现在没有贡献的灯光上循环。