实例化
实例化简单来说就是用更少的消耗创建更多的同样的模型
我们只需要将必须的数据发送到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);
多了的最后那个参数就是绘制实例数量