Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt应用中的libQGL_Qt_Opengl - Fatal编程技术网

Qt应用中的libQGL

Qt应用中的libQGL,qt,opengl,Qt,Opengl,我在Qt项目中使用libQGL制作点云查看器。问题是,点越多(超过300.000),与查看器的交互(旋转、平移、缩放)就越慢。如何修复此问题?在缩放/平移/旋转时渲染较少的点。渲染点云时,可以通过将顶点属性缓冲区的步长乘以3来渲染每三个点 (使用QOpenGLShaderProgram方法) 即使对于一个基本的GPU,300K点的渲染也很简单。您需要提供更多详细信息,说明如何将数据传输到GPU,以及每帧更新要做什么-最好使用代码示例。 void PointCloud::paintGL(){

我在Qt项目中使用libQGL制作点云查看器。问题是,点越多(超过300.000),与查看器的交互(旋转、平移、缩放)就越慢。如何修复此问题?

在缩放/平移/旋转时渲染较少的点。渲染点云时,可以通过将顶点属性缓冲区的步长乘以3来渲染每三个点

(使用QOpenGLShaderProgram方法)


即使对于一个基本的GPU,300K点的渲染也很简单。您需要提供更多详细信息,说明如何将数据传输到GPU,以及每帧更新要做什么-最好使用代码示例。
void PointCloud::paintGL(){
    glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    pointProgram->bind ();
    points.bind ();
    if(transforming){
        pointProgram->setAttributeBuffer (pointLoc, GL_FLOAT, offsetof (PointStruct, data), 3,sizeof(PointStruct)*3);
    } else {
        pointProgram->setAttributeBuffer (pointLoc, GL_FLOAT, offsetof (PointStruct, data), 3,sizeof(PointStruct));
    }
    CHECK_GL_ERR;

    if(transforming){
        pointProgram->setAttributeBuffer (pointCol, GL_FLOAT, offsetof (GrabberPointXYZIT,color), 3,sizeof(GrabberPointXYZIT)*3);
    } else {
        pointProgram->setAttributeBuffer (pointCol, GL_FLOAT, offsetof (GrabberPointXYZIT,color), 3,sizeof(GrabberPointXYZIT));
    }
    CHECK_GL_ERR;
    pointProgram->enableAttributeArray (pointLoc);
    pointProgram->enableAttributeArray (pointCol);
    pointProgram->setUniformValue (mvpLoc, pMat*vMat);

    glDrawArrays (GL_POINTS,0, numPoints);
    CHECK_GL_ERR;


    pointProgram->release ();
    points.release ();
}