我最近一直在研究一个点云播放器,它应该能够理想地可视化来自激光雷达捕获的地形数据点,并以大约 30fps 的速度顺序显示它们。然而,我似乎遇到了 PCI-e IO 的问题。
我需要为每一帧加载一个存储在内存中的大点云,然后根据高度计算颜色图(我使用类似于 matlab 的喷射图),然后将数据传输到 GPU。这适用于点数 < 100 万的云捕获。然而,在大约 200 万个点处,这开始减慢到每秒 30 帧以下。我意识到这是很多数据(每点 200 万帧 * [每点 3 个浮点数 + 每个色点 3 个浮点数] * 每个浮点数 4 字节 * 每秒 30 帧 =大约每秒 1.34 GB)
我的渲染代码现在看起来像这样:
glPointSize(ptSize);
glEnableClientState(GL_VERTEX_ARRAY);
if(colorflag) {
glEnableClientState(GL_COLOR_ARRAY);
} else {
glDisableClientState(GL_COLOR_ARRAY);
glColor3f(1,1,1);
}
glBindBuffer(GL_ARRAY_BUFFER, vbobj[VERT_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, vertData, GL_STREAM_DRAW);
glVertexPointer(3, GL_FLOAT, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbobj[COLOR_OBJ]);
glBufferData(GL_ARRAY_BUFFER, cloudSize, colorData, GL_STREAM_DRAW);
glColorPointer(3, GL_FLOAT, 0, 0);
glDrawArrays(GL_POINTS, 0, numPoints);
glDisableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
vertData 和 colorData 的指针每帧都会改变。
我希望能够以每秒至少 30 帧的速度播放,即使稍后使用可能达到每帧 700 万点的大型点云。这甚至可能吗?或者也许将它们网格化并构建一个高度图并以某种方式显示它会更容易?我对 3-D 编程还是很陌生,所以任何建议都将不胜感激。