绘制多个重复的模型时,使用Instanced方式绘制可以大大加快显然速度。

绘制效果如下图所示:


1、Vertex Shader中定义如下:

attributevec3pos;attributevec2coord;attributevec3normal;attributevec3offset;uniformmat4M;uniformmat4V;uniformmat4P;uniformmat4NM;varyingvec2M_coord;varyingvec3M_normal;varyingvec4M_WordPos;voidmain(){M_coord=coord;M_WordPos=M*vec4(pos,1.0)+vec4(offset,1.0);M_normal=mat3(NM)*normal;gl_Position=P*V*M_WordPos;}

offset为每次绘制的偏移量。


2、CPU端实现

floatnIndexOffset[]={-100.0f,0.0f,0.0f,0.0f,0.0f,0.0f,100.0f,0.0f,0.0f};

createBufferObject为封装创建OpenGL Buffer的函数

定义如下:

GLuintOpenGLOperate::createBufferObject(GLenumnBufferType,GLsizeiptrsize,\constGLvoid*data,GLenumusage){GLuintBufferObjIndex=0;m_OpenGLCore->glGenBuffers(1,&BufferObjIndex);m_OpenGLCore->glBindBuffer(nBufferType,BufferObjIndex);m_OpenGLCore->glBufferData(nBufferType,size,data,usage);m_OpenGLCore->glBindBuffer(nBufferType,0);returnBufferObjIndex;}

创建Offset的FBO

m_OffsetIndex=m_OpenGLOperate->createBufferObject(GL_ARRAY_BUFFER,\sizeof(float)*9,\(void*)nIndexOffset,GL_STATIC_DRAW);

为Offset赋值

OpenGLCore->glBindBuffer(GL_ARRAY_BUFFER,m_OffsetIndex);OpenGLCore->glEnableVertexAttribArray(m_OffsetLocation);OpenGLCore->glVertexAttribPointer(m_OffsetLocation,3,GL_FLOAT,GL_FALSE,\sizeof(float)*3,(void*)0);OpenGLCore->glBindBuffer(GL_ARRAY_BUFFER,0);OpenGLCore->glVertexAttribDivisor(m_OffsetLocation,1);

调用绘制指令:

OpenGLCore->glDrawElementsInstanced(GL_TRIANGLES,m_VertexCount,\GL_UNSIGNED_INT,0,3);