首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我应该使用常量顶点属性而不是制服?

为什么我应该使用常量顶点属性而不是制服?
EN

Stack Overflow用户
提问于 2015-05-19 11:51:03
回答 2查看 1.4K关注 0票数 2

我已经准备好了关于常量顶点属性和Uniforms.Have的几个主题,找到了一些differences,但不明白为什么我需要它们。看来我总能用制服代替履历。对他们有什么用处吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-20 03:38:08

我不认为常数顶点属性(或CVA)是标准术语。至少我从未听说过,你链接的游戏开发问题中的人也对此感到困惑。所以我不认为它被广泛使用。

但根据上下文,我弄清楚了你在问什么。您正在考虑在顶点着色器中使用属性的情况。但是,在进行抽签调用之前,不要将它们从缓冲区中提取出来,而是使用类似于glVertexAttrib4f()的调用来设置它们,这意味着值在再次更改之前保持不变。规范将这些值简单地称为“当前顶点属性值”。

现在,如果以这种方式使用属性,或者使用制服,就没有明确的答案。通常情况下,相对性能将非常依赖于平台/硬件。我个人的观点是:

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

这也符合规范的规定。在关于制服的介绍部分中,它说(重点是另加的):

这些制服的值在原语上是不变的,而且通常在许多原语中是常量

在某些平台上,统一更新是非常有效的,而且应用程序经常更改统一值也并不少见。但IMHO,这不是制服的本意。他们不是毫无意义地被称为uniform

根据用例的不同,还有一些额外的差异可能使其中一种或另一种更有吸引力:

  • 如果有时在同一类型的呈现中使用缓冲区中的每个顶点值,而有时希望使用每个原语值,则使用属性非常方便。有了属性,您可以继续对这两种情况使用相同的着色器,而如果使用unifom,则需要不同的着色器。
  • 属性在它们所支持的类型以及它们通常支持的数量上受到更大的限制。
  • 统一值是每个程序状态的一部分。属性值是全局状态的一部分。
票数 4
EN

Stack Overflow用户

发布于 2016-07-28 13:17:44

这里的关键点是glEnableVertexAttribArray和glDisableVertexAttribArray的用法。来自OpenGL es3.0编程指南第二版.

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

考虑以下场景:您有一些对象要用统一的颜色绘制,还有一些要为每个顶点指定颜色。您可以使用一个顶点着色器,并传递与顶点关联的常量颜色,就好像它是可变的,但是这样做会使内存增加一倍。当然,您可以使用另一个着色器,其中您有一个制服,以指定颜色,所以您优化内存,但您需要两个着色器。禁用顶点属性的颜色代替,让您使用相同的着色器,并优化使用的内存在同一时间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30324845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档