【问题标题】:Why can't I know the state of OpenGL lights in GLSL?为什么我不知道 GLSL 中 OpenGL 灯的状态?
【发布时间】:2009-06-03 19:20:10
【问题描述】:

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

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

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

【问题讨论】:

  • 我相信你不是指旧的固定管道灯......(虽然我意识到老问题)

标签: opengl shader glsl


【解决方案1】:

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

另外我猜这可能是一个设计选择,因为分支在 GPU 上的成本很高,而且一定有人认为你不应该这样做

if (gl_LightSource[0].enabled)
{ ... }

首先。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不确定,但从硬件的角度来看,支持它可能太贵了。
    【解决方案3】:

    如果 GLSL 类似于 HLSL(DirectX 的等价物),我怀疑是这样,我认为您会被传递属性所困扰。

    :-(

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 不错的把戏。它可能有效,但看起来很笨拙(打开/关闭灯比保存/恢复它的颜色要干净得多)。我有点放弃了原来的问题。你不能这样做。现在我对“为什么不呢?”更感兴趣
      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 2018-05-12
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多