为什么我应该使用恒定顶点属性而不是制服?

时间:2015-05-19 11:51:04

标签: opengl opengl-es

我已准备好几个关于恒定顶点属性和制服的主题。找到一些differences,但无法理解为什么我需要它们。我似乎总是可以使用制服而不是CVA。对他们有什么好用的吗?

2 个答案:

答案 0 :(得分:3)

我不认为恒定顶点属性(或CVA)是标准术语。至少我从来没有听过它,并且你在游戏中遇到问题的人也对它感到困惑。所以我不相信它被广泛使用。

但根据背景情况,我想出了你在问什么。您正在考虑在顶点着色器中使用属性的情况。但是,在进行绘制调用之前,不要将它们从缓冲区中拉出来,而是使用glVertexAttrib4f()之类的调用来设置它们,这意味着在您再次更改之前,该值保持不变。规范简单地称这些值为#34;当前顶点属性值"。

现在,如果你应该以这种方式使用属性,或者制服,那么没有明确的答案。通常,相对性能将取决于平台/硬件。我个人的观点是:

  • 制服应该用于相对较少变化的值。理想情况下,每帧最多一次,或者至少比每次抽奖都少得多。
  • 属性应该用于经常更改的值。例如,如果要在每次绘制调用之前更改值,我将使用属性。

这也与规范所说的一致。在关于制服的介绍部分,它说(重点补充):

  

这些制服的值在基元上是恒定的,并且通常它们在许多基元中是恒定的

统一更新在某些平台上非常有效,而且应用程序相当频繁地更改统一值并不罕见。但恕我直言,这不是制服的用途。它们没有被称为统一

根据用例,还有一些额外的差异可能会使一个或另一个更具吸引力:

  • 如果有时使用缓冲区中的每个顶点值进行相同类型的渲染,则使用属性可能非常方便,有时您希望使用每个原始值。使用属性,您可以为这两种情况使用相同的着色器,而如果使用unifom则需要使用不同的着色器。
  • 属性在它们支持的类型以及通常支持的数量方面受到更多限制。
  • 统一值是每个程序状态的一部分。属性值是全局状态的一部分。

答案 1 :(得分:0)

这里的关键点是使用 glEnableVertexAttribArray glDisableVertexAttribArray 。来自 OpenGL ES 3.0编程指南第二版

  

命令glEnableVertexAttribArray和glDisableVertexAttribArray分别用于启用和禁用通用顶点属性数组。如果为通用属性索引禁用顶点属性数组,则将使用为该索引指定的常量顶点属性数据。

请考虑以下情形:您可以使用均匀颜色绘制一些对象,并为每个顶点指定颜色。您可以使用一个顶点着色器并传递与顶点关联的常量颜色,就像它是可变的一样,但这样做可以使所需的内存加倍。当然,你可以使用另一个着色器,在那里你有一个制服来指定颜色,所以你优化了内存,但你需要两个着色器。禁用颜色的顶点属性可以让您使用相同的着色器并同时优化使用的内存。