4

当为我的顶点着色器指定一个不会在每个顶点上变化的值时,我可以选择将其指定为统一或常量顶点属性(使用 glVertexAttrib1f 和朋友)。

我应该选择一个而不是另一个的原因是什么?简单地说,在任何给定的实现中可用的顶点属性和制服数量有限,因此我需要明智地选择,或者是否还有性能影响?

我环顾四周,发现了一些讨论,但没有什么能具体回答我的担忧:- http://www.khronos.org/message_boards/showthread.php/7134-Difference-between-uniform-and-constant-顶点属性 https://gamedev.stackexchange.com/questions/44024/what-is-the-difference-between-constant-vertex-attributes-and-uniforms

我绝不是 OpenGL 大师,所以如果我只是错过了一些基本的东西,我深表歉意。

4

1 回答 1

4

好吧,如果你传递一个顶点属性指针,顶点属性可以设置为每个顶点变化;只需更改将数据提供给特定通用属性位置的方式,您就可以在常量值和每个顶点之间动态切换。

Uniforms 永远不会因顶点而异,它们到目前为止更加恒定。一般来说,GLSL ES 保证您使用的顶点属性槽(8 个,每个最多 4 个组件)比统一组件(128 个向量,每个 4 个组件)要少得多 - 大多数实现都超过了这些要求,但趋势是相同的(更多统一比属性)。

此外,制服是每个程序的状态。这些是可以从 GLSL 程序的任何阶段访问的常量。在 OpenGL ES 2.0 中,这意味着 Vertex / Fragment 着色器,但在桌面 GL 中,这意味着 Vertex、Fragment、Geometry、Tessellation Control、Tessellation Evaluation。

于 2013-10-28T01:59:52.390 回答