来自khronos:
除了执行元素集的primcount实例之外,glDrawElementsInstanced的行为与glDrawElements相同。那些具有除数N的属性,其中N不是零(由glVertexAttribDivisor指定)每N个实例前进一次。
索引渲染和属性除数这两个想法似乎与我不相容。如何让索引选择获取数据的位置,同时具有(实例计数)/(除数)BE作为获取数据的索引。
答案 0 :(得分:5)
确实有意义。使用实例化渲染时,您通常不希望多次绘制完全相同的东西。事实上,你大部分都没有,因为多次绘制完全相同的东西是没有意义的。
实例化渲染旨在绘制非常相似的对象的多个实例,但每个实例之间仍然存在差异。例如,您可能希望绘制大量基本相同但对象位置不同的对象。或者换句话说,每个实例都有自己的翻译向量。
您有两个主要选项来实际绘制每个实例:
gl_InstanceID
。由于每个实例的值都不同,因此您可以使用它来查找或计算每个实例的不同值。除数允许您具有每个实例值的顶点属性。对于我上面提到的例子,这是完美的。您可以拥有包含平移向量的顶点属性。在您从中获取属性的缓冲区中,存储每个实例的转换向量值 。然后,将此属性的除数设置为1。
这允许您使用单个绘制调用绘制对象的多个实例,并使用不同的平移向量。而且您不必复制任何顶点数据。
对于所有现有的顶点属性,例如顶点位置,法线和纹理坐标,将除数保持为默认值0.这意味着它们的行为与之前一样,每个顶点的值都是基于索引缓冲区中的索引获取。
我个人从未使用过大于1的除数值,但它完全有效。您可以对 n 实例使用相同的值,而不是为每个实例使用值。但恕我直言,到目前为止最有用的值是0和1:
gl_InstanceID
)获取值。