七.实时处理多点

 

实时处理大量点时,以前用贴图的方法,qt里用QGraphicsScene贴图还是毫秒级,故这里试了下opengl实时画,结论点少还行,20000个点就不行了,cpu占到10%了,可能三代i5集显太差,这块不大懂了,还是老实贴图吧。也记录一下失败。

就是这么多点,好挂了。

代码没啥说的了,都是一个套路,先把画好的点存好,然后发送还未画的点,直接画。

bool AkGisWidget::SendGpuPoints()

{

    QOpenGLVertexArrayObject *vaop;

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

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

    vaop = new QOpenGLVertexArrayObject;

    vbop = new QOpenGLBuffer(QOpenGLBuffer::VertexBuffer);

    ebop = new QOpenGLBuffer(QOpenGLBuffer::IndexBuffer);

 

    vbop->create();

    ebop->create();

 

    int PointsCount = vecPoints.size();

    if(PointsCount-randered<1)

        return false;

 

    float* vertices = new float[(PointsCount-randered) * 5 * sizeof(float)];

 

    std::vector<unsigned int > indices;

    int index = 0;

    for (int i = randered; i < PointsCount; ++i) {

        qDebug()<<"PointsCount"<< vecPoints[i].x<<vecPoints[i].y<<randered<< PointsCount;

        vertices[index] =  vecPoints[i].x;

        vertices[index + 1] = vecPoints[i].y;

        vertices[index + 2] = 0.5;

        vertices[index + 3] = 0.6;

        vertices[index + 4] = 0.1;

        index += 5;

        indices.push_back(i-randered);

    }

    QOpenGLVertexArrayObject::Binder vaoBind(vaop);

 

    vbop->bind();

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

 

    ebop->bind();

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

 

//    if (!pointsadded )

  //  {

        FeatureDesc featureDesc;

        featureDesc.type = 4;

        featureDesc.indexCnt = indices.size();

        featureDesc.vexCnt = PointsCount - randered;

        featureDesc.vao = vaop;

        featureDesc.vbo = vbop;

        featureDesc.ebo = ebop;

        featureDesc.shader = &pointShader;

 

        vecFeatureDesc.append(featureDesc);

        pointsadded = true;

        pointsFeatureIndex = vecFeatureDesc.count()-1;

  //  }

    randered = PointsCount;

 

//    if(pointsFeatureIndex>=0)

//    {

 

//        vecFeatureDesc[pointsFeatureIndex].indexCnt = 0;

//        vecFeatureDesc[pointsFeatureIndex].vexCnt = PointsCount;

//    }

 

    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);

 

    vbop->release();

    return true;

}

渲染点

        if(vecFeatureDesc[i].type==4)

        {

            lineShader.bind();               lineShader.setUniformValue("u_MVP", mvp);

                QOpenGLVertexArrayObject::Binder vaoBind(vecFeatureDesc[i].vao);

                vecFeatureDesc[i].ebo->bind();

                glDrawElements(GL_POINTS,vecFeatureDesc[i].vexCnt, GL_UNSIGNED_INT, nullptr);

        }

猜你喜欢

转载自www.cnblogs.com/fkess/p/12513153.html