【发布时间】:2009-06-03 19:20:10
【问题描述】:
有没有办法查明是否在 GLSL 中启用了不涉及传递属性或创建大量不同着色器的灯光?
使用 NVidia 的 C for Graphics (Cg) 会怎样?我可以用 Cg 做吗?
我现在确信你做不到。但现在我问:为什么不呢?
【问题讨论】:
-
我相信你不是指旧的固定管道灯......(虽然我意识到老问题)
有没有办法查明是否在 GLSL 中启用了不涉及传递属性或创建大量不同着色器的灯光?
使用 NVidia 的 C for Graphics (Cg) 会怎样?我可以用 Cg 做吗?
我现在确信你做不到。但现在我问:为什么不呢?
【问题讨论】:
根据我对GLSL Common Mistakes 的“启用或不启用”部分的理解,这是一个哲学原因:编写着色器是为了覆盖固定的管道,因此它们不应该依赖于固定的管道状态。您必须为所需的每种功能使用不同的着色器。
另外我猜这可能是一个设计选择,因为分支在 GPU 上的成本很高,而且一定有人认为你不应该这样做
if (gl_LightSource[0].enabled)
{ ... }
首先。
【讨论】:
unforgiven3 是对的 - GLSL 不提供对固定管道启用状态的访问。您必须将其作为制服传递。
【讨论】:
如果 GLSL 类似于 HLSL(DirectX 的等价物),我怀疑是这样,我认为您会被传递属性所困扰。
:-(
【讨论】:
您可以将灯光颜色设置为 (0,0,0,0) 并在此基础上进行分支,或者让它在现在没有贡献的灯光上循环。
【讨论】: