【问题标题】:Efficiently draw large number of point cloud points in OpenGL?在OpenGL中高效绘制大量点云点?
【发布时间】:2019-10-23 08:48:43
【问题描述】:

我的程序不断收到大量 PCL 点云格式的点,即pcl::PointCloud<pcl::PointXYZI>::Ptr,实际上是std::vector< pcl::PointXYZI, Eigen::aligned_allocator< pcl::PointXYZI > >

我想在收到点后立即在 OpenGL 中实时绘制点。我知道如何以传统方式绘画。每次我收到一组新的点时,我都会将它们一个接一个地复制到我的顶点向量中(我使用的是 Qt,所以它是 QVector<QVector3D>),同时构造颜色向量也是 QVector<QVector3D>。将这两个向量复制到 VBO 后,我可以在一次绘制调用中将它们全部绘制出来。但是,点的数量通常太大(每帧大约 100k 点,频率为 10Hz),从原始 PCL 格式复制到我的 Qt 矢量和构建颜色矢量似乎是对时间和计算能力的极大浪费。

有没有办法绕过复制直接画点呢?我能想到的解决方案可能是因为PCL点云格式是std::vector,所以可以直接将它用于draw call,就像我得到vector指针并直接复制到VBO中一样。但是这样一来,如何构造颜色向量呢?如果所有点都是相同的颜色,有没有一种方法可以为所有点分配颜色而不为每个顶点构造颜色向量?我猜可能是通过片段着色器?

【问题讨论】:

  • 为什么不直接将新点复制到向量中?

标签: c++ qt opengl optimization point-cloud-library


【解决方案1】:

如果点不移动,您只能上传使用glBufferSubData 添加的点(与创建新缓冲区并初始化的glBufferData 不同)。

这个想法是:

  • 您创建了一个大缓冲区,能够容纳我们可能拥有的所有点 (glBufferData)。
  • 随着积分的到来,我们使用glBufferSubData将它们添加到缓冲区的末尾。
  • 当您要绘制glDrawArrays 时,请确保将您当前拥有的点数传递给参数count

如果所有点都是相同的颜色,有没有办法可以分配 所有点的颜色,而不为 每个顶点?我猜可能是通过片段着色器?

是的,你可以穿制服。

在您的着色器代码中声明:

uniform vec4 u_color;

然后在 C++ 中,您可以使用 glUniform4f 分配值:

glUniform4f(1.f, 0.f, 0.f, 1.f); // all points are red

【讨论】:

  • 感谢您的回答。我对所有绘图使用相同的着色器,其中一些使用带有自己颜色矢量的顶点,其中一些像我要求的那样想使用统一变量设置颜色。如何在着色器中结合这两种情况?
  • 你可以默认使用每个顶点的颜色,并且对于那些想要使用统一颜色的顶点有一个特殊的颜色代码。 if vertexColor == vec4(1, 1, 1, 0) color = uniformColor; else color = vertexColor;
【解决方案2】:

为什么代理会复制到 QVector 中?您可以将pcl::PointCloud 直接复制到 VBO 中,而无需在中间进行此时间和内存带宽消耗步骤。此外,每点 16 字节的 100k 点小于 2MB,在今天这几乎不算什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多