六. 渲染
先设置坐标系mvp,再开画,就是三角形+边框
void AkGisWidget::paintGL(){
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
QMatrix4x4 projection;
projection.ortho(xMin,xMax,yMin,yMax,-1,1);
QMatrix4x4 view;
view.lookAt(QVector3D(0.0f, 0.0f, 1.0f),QVector3D(0.0f, 0.0f, -1.0f),QVector3D(0.0f, 1.0f, 0.0f));
trans=QMatrix4x4();
trans.translate(QVector3D(xOffset, yOffset, 0.0f));
scale=QMatrix4x4();
scale.scale(QVector3D(zoom, zoom, 1.0f));
QMatrix4x4 mvp = projection*view*trans*scale;
//得到mvp,回头也可以根据offset,zoom来滚鼠标
for(int i=0;i<vecFeatureDesc.count();i++)
{
if( vecFeatureDesc[i].type==3)//多边形
{
//qDebug()<<"paintGL i "<<i<<vecFeatureDesc.count()<<vecFeatureDesc[i].indexCnt;
vecFeatureDesc[i].shader->bind();
vecFeatureDesc[i].shader->setUniformValue("u_MVP", mvp);
{
//vecFeatureDesc[i].vao->bind();
vecFeatureDesc[i].ebo->bind();
QOpenGLVertexArrayObject::Binder vaoBind(vecFeatureDesc[i].vao);
// glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawElements(GL_TRIANGLES, vecFeatureDesc[i].indexCnt, GL_UNSIGNED_INT, 0);
}
//polygonShader.release();
//画边界
borderShader.bind();
borderShader.setUniformValue("u_MVP", mvp);
QOpenGLVertexArrayObject::Binder vaoBind(vecFeatureDesc[i].vao);
glDrawArrays(GL_LINE_STRIP,0,vecFeatureDesc[i].vexCnt);
// borderShader.release();
}
if(vecFeatureDesc[i].type==6) //多多边形
{
//qDebug()<<"paintGL i "<<i<<vecFeatureDesc.count()<<vecFeatureDesc[i].indexCnt <<vecFeatureDesc[i].vexCnt;
vecFeatureDesc[i].shader->bind();
vecFeatureDesc[i].shader->setUniformValue("u_MVP", mvp);
{
QOpenGLVertexArrayObject::Binder vaoBind(vecFeatureDesc[i].vao);
//vecFeatureDesc[i].vao->bind();
//循环ebo
for(int j=0;j<vecFeatureDesc[i].vecIdx.size()-1;j++)
//for(int j=0;j<1;j++)
{
vecFeatureDesc[i].vecEbo[j]->bind();
// glDrawArrays(GL_TRIANGLES, 0, 3);
glDrawElements(GL_TRIANGLES, vecFeatureDesc[i].vecIdx[j+1], GL_UNSIGNED_INT, 0);
//qDebug()<<"ebo"<<vecFeatureDesc[i].vecEbo[j]->bufferId()<<vecFeatureDesc[i].vecIdx[j+1];
}
}
//polygonShader.release();
//画边界
borderShader.bind();
borderShader.setUniformValue("u_MVP", mvp);
int vexOff=0;
for(int j=0;j<vecFeatureDesc[i].vecVex.size()-1;j++)
{
QOpenGLVertexArrayObject::Binder vaoBind(vecFeatureDesc[i].vao);
glDrawArrays(GL_LINE_STRIP,vexOff,
vecFeatureDesc[i].vecVex[j+1]);
vexOff+=vecFeatureDesc[i].vecVex[j+1];
}
//borderShader.release();
}
}
}
浙公网安备 33010602011771号