基于Qt的OpenGL可编程管线学习(3)- 使用Instanced方式绘制
绘制多个重复的模型时,使用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);
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。