三.处理多边形

 

发送多边形数据到gpu,用了qt自个的封装,先读数,存起来,再发送到gpu,将gpu信息也好,好画图。

先定义了个结构,用于存放vaovboebo,等

typedef struct _FeatureDesc{

    int type;//类型

    int indexCnt;//索引数量

    int vexCnt;//顶点数量

    QOpenGLVertexArrayObject* vao;

    QOpenGLBuffer* vbo;//{QOpenGLBuffer::VertexBuffer};

    QOpenGLBuffer* ebo;//{QOpenGLBuffer::IndexBuffer};

    QOpenGLShaderProgram* shader;//也可以不要

    std::vector<QOpenGLBuffer*> vecEbo;//多多边形,ebo列表

    std::vector<int> vecVex;//多多边形,顶点数

    std::vector<int> vecIdx;//多多边形,索引数

}FeatureDesc;

 

 

bool AkGisWidget::SendGpuOGRPolygon(OGRPolygon *pPolygon)

{

    if (!pPolygon )

        return false;

 

    QOpenGLVertexArrayObject *vao;

    QOpenGLBuffer *vbo;//{QOpenGLBuffer::VertexBuffer};

    QOpenGLBuffer *ebo;//{QOpenGLBuffer::IndexBuffer};

 

    vao = new QOpenGLVertexArrayObject;

    vbo = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);

    ebo = new QOpenGLBuffer(QOpenGLBuffer::IndexBuffer);

 

    OGRPoint ptTemp;

    int numInteriorRings = pPolygon->getNumInteriorRings();

 

    // 外环,不考虑内环了

    OGRLinearRing* poExteriorRing = pPolygon->getExteriorRing();

    int numExteriorRingPoints = poExteriorRing->getNumPoints();

 

    int polygonPointsCount = numExteriorRingPoints;

    float* vertices = new float[polygonPointsCount * 5 * sizeof(float)];

    int iStride = 0;

 

    using Point = std::array<double, 2>;

    std::vector<std::vector<Point>> polygon;

 

    std::vector<Point> exteriorRing;

    exteriorRing.reserve(numExteriorRingPoints);

int index = 0;

//把点都存起来,还给了个rgb,

    for (int i = 0; i < numExteriorRingPoints; ++i) {

        poExteriorRing->getPoint(i, &ptTemp);

        exteriorRing.push_back({ptTemp.getX(),ptTemp.getY()});

 

        vertices[index] =  ptTemp.getX();

        vertices[index + 1] = ptTemp.getY();

        vertices[index + 2] = 0.5;

        vertices[index + 3] = 0.6;

        vertices[index + 4] = 0.1;

        index += 5;

    }

 

    polygon.emplace_back(exteriorRing);

//一个库,切三角形,得到索引

    std::vector<unsigned int> indices = mapbox::earcut<unsigned int>(polygon);

 

    //qDebug()<<"3 indices"<<sizeof(unsigned int)<<index<<indices.size();

    QOpenGLVertexArrayObject::Binder vaoBind(vao);

//发给gpu

    vbo->create();

    vbo->bind();

    vbo->allocate(vertices,4*index);

 

    ebo->create();

    ebo->bind();

    ebo->allocate(&indices[0],indices.size()*4);

 

//gpu信息存好

    FeatureDesc featureDesc;

    featureDesc.type = 3;

    featureDesc.indexCnt = indices.size();

    featureDesc.vexCnt = numExteriorRingPoints;

    featureDesc.vao = vao;

    featureDesc.vbo = vbo;

    featureDesc.ebo = ebo;

    featureDesc.shader = &polygonShader;

 

    vecFeatureDesc.append(featureDesc);

 

//告诉shader怎么取数

    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0);

    glEnableVertexAttribArray(0);

    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));

    glEnableVertexAttribArray(1);

 

    vbo->release();

    return true;

}

posted @ 2020-03-16 20:32  fkess  阅读(409)  评论(0)    收藏  举报