三.处理多边形
发送多边形数据到gpu,用了qt自个的封装,先读数,存起来,再发送到gpu,将gpu信息也好,好画图。
先定义了个结构,用于存放vao,vbo,ebo,等
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;
}
浙公网安备 33010602011771号