六. 渲染

 

先设置坐标系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();

        }

    }

 

}

posted @ 2020-03-16 22:27  fkess  阅读(273)  评论(0)    收藏  举报