GLSL ES中的统一变量与属性的区别

30
我有一些参数要从CPU传递到GPU,这些参数对于所有片段都是不变的,但每帧会发生改变(我正在使用GLSL ES 1.1)。那么我应该使用uniform还是attribute来处理这些值?Attribute可以在顶点之间变化,所以我的直觉告诉我,对于整个帧都是常量的值,使用attribute可能效率低下。然而,我读过uniform是用于“相对不经常”更改的值,这表明每帧更改uniform可能效率低下。
就硬件而言,我最希望优化的是iPhone 4S。

你能列出你的阅读材料吗? - Luca
1
《OpenGL Shading Language》一书由Rost和Licea-Kane合著,而《OpenGL ES 2.0》一书则由Munchi、Ginsburg和Shreiner合著。(显然前者不特定于ES) - Alex Flint
1个回答

35

我支持统一着装。

其中一个原因已经在你的问题中解释过了:统一着装是每个顶点/片段的常量。

其他偏爱使用统一变量而不是属性的原因包括:

  • 可用插槽数量(您可以使用16个属性,但可以使用更多的统一变量)
  • GLSL编译器可以优化统一变量值的处理
  • 长顶点数组上的数据流较少,每个顶点的属性较少意味着更好的性能。
  • 片段着色器中也可以使用统一变量,而不需要在顶点和片段着色器之间定义varying属性
  • 统一变量可以是结构体和数组,这会导致更易读的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接