属性除数如何与索引绘图一起使用

时间:2015-07-14 05:17:16

标签: opengl

来自khronos:

  除了执行元素集的primcount实例之外,

glDrawElementsInstanced的行为与glDrawElements相同。那些具有除数N的属性,其中N不是零(由glVertexAttribDivisor指定)每N个实例前进一次。

索引渲染和属性除数这两个想法似乎与我不相容。如何让索引选择获取数据的位置,同时具有(实例计数)/(除数)BE作为获取数据的索引。

1 个答案:

答案 0 :(得分:5)

确实有意义。使用实例化渲染时,您通常不希望多次绘制完全相同的东西。事实上,你大部分都没有,因为多次绘制完全相同的东西是没有意义的。

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

您有两个主要选项来实际绘制每个实例:

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

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

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

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

我个人从未使用过大于1的除数值,但它完全有效。您可以对 n 实例使用相同的值,而不是为每个实例使用值。但恕我直言,到目前为止最有用的值是0和1:

  • 0,默认值,指定该属性的行为与往常一样,这意味着该值是根据顶点索引获取的。
  • 1指定每个实例有一个属性值,并根据实例ID(gl_InstanceID)获取值。