当为我的顶点着色器指定一个不会在每个顶点上变化的值时,我可以选择将其指定为统一或常量顶点属性(使用 glVertexAttrib1f 和 friend )。
我应该选择一个而不是另一个的原因是什么?简单地说,在任何给定的实现上都有有限数量的可用顶点属性和制服,因此我需要明智地选择,或者是否还有性能影响?
我环顾四周,发现了一些讨论,但没有什么能具体回答我的担忧:
- http://www.khronos.org/message_boards/showthread.php/7134-Difference-between-uniform-and-constant-vertex-attribute
https://gamedev.stackexchange.com/questions/44024/what-is-the-difference-between-constant-vertex-attributes-and-uniforms
我绝不是 OpenGL 大师,所以如果我只是错过了一些基本的东西,我深表歉意。
最佳答案
好吧,如果你传递一个顶点属性指针,顶点属性可以设置为每个顶点变化;只需更改将数据提供给特定通用属性位置的方式,您就可以在常量值和每个顶点之间动态切换。
Uniforms 永远不会因顶点而异,它们到目前为止更加恒定。一般来说,GLSL ES 保证您使用的顶点属性槽(8 个,每个最多 4 个组件)比统一组件(128 个向量,每个 4 个组件)要少得多 - 大多数实现都超过了这些要求,但趋势是相同的(更多统一比属性)。
此外,制服是每个程序的状态。这些是可以从 GLSL 程序的任何阶段访问的常量。在 OpenGL ES 2.0 中,这意味着 Vertex/Fragment 着色器,但在桌面 GL 中,这意味着 Vertex、Fragment、Geometry、Tessellation Control、Tessellation Evaluation。
关于opengl-es - OpenGL ES 2 中的常量顶点属性与统一的含义是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19617773/