gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:21:13 30 4
gpt4 key购买 nike

我已经准备好了几个关于常量顶点属性和统一的主题。已经找到了一些differences但无法理解为什么我需要它们。看来我总是可以用制服代替 CVA。它们有什么好的用例吗?

最佳答案

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

但是根据上下文,我明白了你在问什么。您正在考虑在顶点着色器中使用属性的情况。但是,您无需从缓冲区中提取它们,而是在进行绘制调用之前使用 glVertexAttrib4f() 等调用来设置它们,这意味着该值将保持不变,直到您再次更改它。规范将这些值简称为“当前顶点属性值”。

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

  • 统一应用于相对很少变化的值。理想情况下每帧最多一次,或者至少比每次绘制调用的频率低得多。
  • 属性应该用于经常更改的值。例如,如果您想在每次绘制调用之前更改值,我将使用一个属性。

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

Values for these uniforms are constant over a primitive, and typically they are constant across many primitives.

统一更新在某些平台上可能非常有效,并且应用程序相当频繁地更改统一值当然并不罕见。但恕我直言,这不是制服的预期用途。他们被称为制服可不是无缘无故的!

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

  • 如果您有时使用缓冲区中的每个顶点值进行相同类型的渲染,有时您想使用每个图元值,那么使用属性会非常方便。通过属性,您可以在这两种情况下继续使用相同的着色器,而如果您使用uniform,则需要不同的着色器。
  • 属性在其支持的类型以及通常支持的数量方面受到更多限制。
  • 统一值是每个程序状态的一部分。属性值是全局状态的一部分。

关于opengl - 为什么我应该使用常量顶点属性而不是制服?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30324845/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com