OpenGL3.3实例化

实例化
实例化简单来说就是用更少的消耗创建更多的同样的模型
我们只需要将必须的数据发送到GPU一次,然后使用一次函数调用告诉GPU它应该如何绘制这些实例。GPU将会直接渲染这些实例,而不用不断地与CPU进行通信

使用glDrawArrays或glDrawElements函数告诉GPU去绘制你的顶点数据会消耗更多的性能,因为在绘制前要准备很多工作
改成这个就行了glDrawArraysInstanced和glDrawElementsInstanced就可以了

顶点属性最大允许的数据大小等于一个vec4
因为一个mat4本质上是4个vec4,我们需要为这个矩阵预留4个顶点属性。因为我们将它的位置值设置为3,矩阵每一列的顶点属性位置值就是3、4、5和6。 所有片段着色器里面aInstanceMatrix传进去是从3开始的

实例化不直接用模型的draw函数 也就是印证了第一句话 如果使用draw函数就会每绘制一个模型都需要传一次数据上去 而实例化 他先把绘制方法传递给gpu 应该就是直接把模型的vao传出来一次就行 这样gpu就知道怎么绘制了 然后再不停的绘制就行了

实例化使用实例化数组的原因是因为如果我们创建的实例化目标过多通过uniform传入数据时,着色器的uniform数据大小上限

gl_InstanceID
在实例化渲染的时候,gl_InstanceID会从0开始,在每个实例被渲染时递增1
这个变量是在着色器中可以直接使用的 和gl_Postion一样

glVertexAttribDivisor(2, 1);这个函数告诉了OpenGL该什么时候更新顶点属性的内容至新一组数据
第一个参数:位置值为x的顶点属性进行更新,例如这个layout (location = 2) in vec2 aOffset;
第二个参数:属性除数,每x个实例更新一次属性

glDrawElementsInstanced(GL_TRIANGLES, model.meshes[i].indices.size(), GL_UNSIGNED_INT, 0, amount);
多了的最后那个参数就是绘制实例数量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值