我已准备好几个关于恒定顶点属性和制服的主题。找到一些differences,但无法理解为什么我需要它们。我似乎总是可以使用制服而不是CVA。对他们有什么好用的吗?
答案 0 :(得分:3)
我不认为恒定顶点属性(或CVA)是标准术语。至少我从来没有听过它,并且你在游戏中遇到问题的人也对它感到困惑。所以我不相信它被广泛使用。
但根据背景情况,我想出了你在问什么。您正在考虑在顶点着色器中使用属性的情况。但是,在进行绘制调用之前,不要将它们从缓冲区中拉出来,而是使用glVertexAttrib4f()
之类的调用来设置它们,这意味着在您再次更改之前,该值保持不变。规范简单地称这些值为#34;当前顶点属性值"。
现在,如果你应该以这种方式使用属性,或者制服,那么没有明确的答案。通常,相对性能将取决于平台/硬件。我个人的观点是:
这也与规范所说的一致。在关于制服的介绍部分,它说(重点补充):
这些制服的值在基元上是恒定的,并且通常它们在许多基元中是恒定的。
统一更新在某些平台上非常有效,而且应用程序相当频繁地更改统一值并不罕见。但恕我直言,这不是制服的用途。它们没有被称为统一!
根据用例,还有一些额外的差异可能会使一个或另一个更具吸引力:
答案 1 :(得分:0)
这里的关键点是使用 glEnableVertexAttribArray 和 glDisableVertexAttribArray 。来自 OpenGL ES 3.0编程指南第二版
命令glEnableVertexAttribArray和glDisableVertexAttribArray分别用于启用和禁用通用顶点属性数组。如果为通用属性索引禁用顶点属性数组,则将使用为该索引指定的常量顶点属性数据。
请考虑以下情形:您可以使用均匀颜色绘制一些对象,并为每个顶点指定颜色。您可以使用一个顶点着色器并传递与顶点关联的常量颜色,就像它是可变的一样,但这样做可以使所需的内存加倍。当然,你可以使用另一个着色器,在那里你有一个制服来指定颜色,所以你优化了内存,但你需要两个着色器。禁用颜色的顶点属性可以让您使用相同的着色器并同时优化使用的内存。