高级话题
OpenGL 3.1(尤其是GLSL 1.40)增加了对实例化绘制的支持,它提供了另一个额外的值gl_InstanceID(叫做实例ID,并且它只在顶点着色器中可用),对于指定的每一组图元,该ID相应递增。
glDrawArraysInstanced()的运行和glMultiDrawArrays()类似,只不过对于glDrawArrays()的每次调用,开始索引和顶点计数是相同的(分别由first和count指定)。
- void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
primcount次有效地调用glDrawArrays(),在每次调用前设置GLSL顶点着色器值gl_InstanceID。mode指定了图元类型。first和count指定了传递给glDrawArrays()的数组元素的范围。
glDrawArraysInstanced()和如下的连续调用具有相同的效果(只不过我们的应用程序不必手动更新gl_InstanceID):
- for (i = 0; i < primcount; i++) {
- gl_InstanceID = i;
- glDrawArrays(mode, first, count);
- }
- gl_InstanceID = 0;
同样,glDrawElementsInstanced()执行同样的操作,但是允许随机访问顶点数组中的数据。
- void glDrawElementsInstanced(GLenum mode, GLsizei count,
- GLenum type, const void *indicies,
- GLsizei primcount);
primcount次有效地调用glDrawElements(),在每次调用前设置GLSL顶点着色器值gl_InstanceID。mode指定了图元类型。type指定了数组索引的数据类型,并且必须是如下之一:GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT或GL_UNSIGNED_INT。indicies和count指定了传递给glDrawElements()的数组元素的范围。
glDrawElementsInstanced()的实现如下所示:
- for (i = 0; i < primcount; i++) {
- gl_InstanceID = i;
- glDrawElements(mode, count, type, indicies);
- }
- gl_InstanceID = 0;