gpt4 book ai didi

opengl - 属性除数如何与索引绘图配合使用

转载 作者:行者123 更新时间:2023-12-03 20:18:58 27 4
gpt4 key购买 nike

来自 khronos:

glDrawElementsInstanced behaves identically to glDrawElements except that primcount instances of the set of elements are executed. Those attributes that have divisor N where N is other than zero (as specified by glVertexAttribDivisor) advance once every N instances.



索引渲染和属性除数这两个想法对我来说似乎不相容。你如何让一个索引选择哪个位置来获取数据,同时有一个(实例计数)/(除数)BE 索引来获取数据。

最佳答案

它确实有道理。使用实例化渲染时,您通常不想绘制 正好同一件事多次。事实上,你大多不会,因为多次绘制完全相同的东西是没有意义的。

实例化渲染旨在绘制一个对象的多个非常相似的实例,但每个实例之间仍然存在差异。例如,您可能想要绘制许多基本相同但位置不同的对象。或者换句话说,每个实例都有自己的平移向量。

您有两个主要选项可以以不同的方式实际绘制每个实例:

  • 您可以使用 gl_InstanceID在顶点着色器中。由于每个实例都有不同的值,因此您可以使用它来查找或计算每个实例的不同值。
  • 您可以使用属性除数。

  • 除数允许您拥有每个实例都有一个值的顶点属性。对于我上面提到的例子,这是完美的。您可以拥有一个包含平移向量的顶点属性。在您从中获取属性的缓冲区中,您可以为每个实例存储一个平移向量值。然后将此属性的除数设置为 1。

    这允许您使用单个绘制调用绘制对象的多个实例,并具有不同的平移向量。而且您不必复制任何顶点数据。

    对于所有现有的顶点属性,例如顶点位置、法线和纹理坐标,将除数保持为其默认值 0。这意味着它们的行为与以前一样,每个顶点的值都根据索引缓冲区中的索引。

    我个人从未使用过大于 1 的除数值,但它完全有效。您可以为 n 个实例使用相同的值,而不是为每个实例使用一个值。但恕我直言,到目前为止最有用的值是 0 和 1:
  • 0(默认值)指定属性的行为与往常一样,这意味着根据顶点索引获取值。
  • 1 指定每个实例有一个属性值,并且根据实例 ID ( gl_InstanceID ) 获取该值。
  • 关于opengl - 属性除数如何与索引绘图配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31398169/

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