树优化OpenGL Pointcloud

时间:2017-07-19 07:12:51

标签: c++ opengl optimization

我想优化我的OpenGL程序。 它包括加载3D点矢量然后将着色器应用于它们。 但是我有数十亿分,当我试图看到分数时,我的FPS下降到了2。

实际上我发送了每一个点,我相信这对我的电脑来说太过分了。

是否正在制作一个KD树(例如)来存储我的点,然后只向观察截头中包含的点发送到我的着色器,这是优化程序的有效方法?

而且,既然我的目标不是研究积分,而只是在观察视锥中使用点,哪棵树会更好?八叉树? KD树?

1 个答案:

答案 0 :(得分:1)

使用树木绝对是处理大点云的好方法。我在一个点云渲染软件上工作了一段时间,我们使用kd树进行渲染,并使用常规体素网格进行分析。

我并不完全记得使用八叉树的原因,但我想这取决于你的云的密度分布:如果你有一些带有一些小的高密度区域的大点云,你会有八叉树中有很多空单元,无论是均匀分布的点云,八叉树都可能更简单。我们还有2.5D地图(来自空中扫描:几平方公里的地形,但高度只有很小的偏差)我们使用四棵树进行某些任务。

我们也没有渲染出平截头体中的所有点,因为它会退化,例如当你一直缩放时,整个点云再次出现在平截头体中。

相反,kd树中的所有内部(非叶子)节点都包含一个"代表"选择他们孩子中的点,我们只根据从摄像机到每个节点的边界体积的距离,将树渲染到看起来合适的深度。这样,对于远离相机的区域,您可以渲染点云的稀疏版本,这是一种LOD。

如果你想看上去:我们实际上保持了一个前线"节点,即从左到右穿过树的线或切割,应该渲染所有节点。通过这种方式,我们不需要检查每个节点,而只需检查剪切中的节点("渲染"或#34;未渲染")是否应该更改。另外,我们有非核心点云,其中大于(V)RAM,如果父节点已从磁盘加载,我们允许前端仅向下移动。

kd-tree有点难以构建,因为您需要确定分割平面的位置。为此,我们使用了第一遍,我们读取了节点中所有点的位置,确定了分割平面,然后是第二遍进行实际分割。

我认为我们每个节点有4096个点(我认为我们试验了更多,8k或16k也很好),并且每个节点进行一次绘图调用。只要您的点云适合VRAM,您可以简单地将其全部放在一个大缓冲区中,并使用偏移量将调用绘制到该缓冲区中。