30

我有一些参数从 CPU 传递到 GPU,这些参数对于所有片段都是恒定的,但在每一帧上都会发生变化(我使用的是 GLSL ES 1.1)。我应该为这些值使用制服或属性吗?属性可能因顶点而异,因此我的直觉是,将属性用于在整个帧中保持不变的值将是低效的。但是,我读过制服是针对“相对不经常”变化的值,这表明在每一帧上更换制服可能效率低下。

在硬件方面,我最感兴趣的是针对 iPhone 4S 进行优化。

4

1 回答 1

35

我投票支持制服。

您的问题中已经解释了其中一个原因:制服是每个顶点/片段的常量。

更喜欢制服而不是属性的其他原因是:

  • 可用插槽的数量(允许有 16 个属性,但还有更多的制服)
  • GLSL 编译器可以优化统一值处理
  • 长顶点数组上的数据流越少,每个顶点的属性越少意味着性能越好。
  • 统一在片段着色器中可用,无需在顶点和片段着色器之间定义不同的属性
  • 制服可以是结构和数组,从而使代码更具可读性。
于 2012-06-22T16:21:01.003 回答