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