2.6.5 实例化绘制glDrawArraysInstanced()

来源:互联网 发布:网站迁移到阿里云 编辑:程序博客网 时间:2024/05/15 04:20

高级话题

OpenGL 3.1(尤其是GLSL 1.40)增加了对实例化绘制的支持,它提供了另一个额外的值gl_InstanceID(叫做实例ID,并且它只在顶点着色器中可用),对于指定的每一组图元,该ID相应递增。

glDrawArraysInstanced()的运行和glMultiDrawArrays()类似,只不过对于glDrawArrays()的每次调用,开始索引和顶点计数是相同的(分别由first和count指定)。

  1. void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count,  GLsizei primcount); 

primcount次有效地调用glDrawArrays(),在每次调用前设置GLSL顶点着色器值gl_InstanceID。mode指定了图元类型。first和count指定了传递给glDrawArrays()的数组元素的范围。

glDrawArraysInstanced()和如下的连续调用具有相同的效果(只不过我们的应用程序不必手动更新gl_InstanceID):

  1. for (i = 0; i < primcount; i++) {  
  2. gl_InstanceID = i;  
  3. glDrawArrays(mode, first, count);  
  4. }  
  5. gl_InstanceID = 0

同样,glDrawElementsInstanced()执行同样的操作,但是允许随机访问顶点数组中的数据。

  1. void glDrawElementsInstanced(GLenum mode, GLsizei count,  
  2. GLenum type, const void *indicies,  
  3. GLsizei primcount); 

primcount次有效地调用glDrawElements(),在每次调用前设置GLSL顶点着色器值gl_InstanceID。mode指定了图元类型。type指定了数组索引的数据类型,并且必须是如下之一:GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT或GL_UNSIGNED_INT。indicies和count指定了传递给glDrawElements()的数组元素的范围。

glDrawElementsInstanced()的实现如下所示:

  1. for (i = 0; i < primcount; i++) {  
  2. gl_InstanceID = i;  
  3. glDrawElements(mode, count, type, indicies);  
  4. }  
  5. gl_InstanceID = 0
0 0
原创粉丝点击