使用glMultiDrawArrays时,OpenGL是否允许您提供数组属性?

时间:2017-05-12 15:27:31

标签: opengl

我使用glMultiDrawArrays命令绘制了一堆基元(在我的例子中是行)。每个数组(行)都有一些特定于该数组的附加属性。

我基本上想要传递这些"数组属性"作为每个数组特定的单独uniform

我现在想到的两种方式是:

  1. 在单独的绘制调用中绘制每个数组(行),并将该属性指定为uniform
  2. 将这些属性作为顶点属性传递。这将要求我存储与我有顶点相同值的副本(我可以在数组中最多100k)。如果我必须存储它们,不是一个选择!
  3. 在OpenGL中有更聪明的方法吗?

    说我要绘制n个原语。 glMultiDrawArrays命令已经要求我传递两个大小为n的数组。一个数组(lineStartIndex)的起始索引和一个数组(lineCount)存储每个数组包含多少个顶点。

    对我而言似乎应该可以以类似的方式指定顶点数组属性。例如。大小为arrayAttributes的{​​{1}}向量,也可以与绘制调用一起传递。

    所以不是n我喜欢像vertexAttribArray;)

    是的,我只使用一个VAO和一个VBO。

1 个答案:

答案 0 :(得分:0)

  

对我而言似乎应该可以以类似的方式指定顶点数组属性。

为什么呢?顶点属性适用于每顶点变化的事物;你为什么希望能够将它们用于每顶点变化的东西?

嗯,你可以(我会解释),但我不知道为什么你认为它应该是可能的。

instancing and base instance feature可以(ab)用于为绘制调用中的着色器提供类似于统一的值。

您需要设置要提供的属性" per-line"作为instanced array attribute。因此,对于该属性,您将使用值{1}的glVertexAttribDivisor

然后,对于每一行,您将调用glDrawArraysInstancedBaseInstance。每个调用代表一行,因此您将提供实例计数1.但基本实例表示该行的属性数组中的索引"每行"值。

是的,你没有使用多次抽奖。但OpenGL的绘制调用开销很小;它将绘制调用与状态变化相结合。并且你不会在通话之间改变状态,所以没有问题。

但是,如果您担心这种轻微的开销,并且可以访问multi-draw indirect功能,那么您始终可以使用它。每一行都是多次抽奖中的单独抽奖。

当然,基本实例需要GL 4.2或ARB_base_instance。如果您无法访问此类硬件,那么您将不得不坚持使用uniform变量方法。