2.6.5 实例化绘制glDrawArraysInstanced()

高级话题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值