【发布时间】:2011-03-24 11:01:30
【问题描述】:
我最近一直在研究一个点云播放器,它应该能够理想地可视化来自激光雷达捕获的地形数据点,并以大约 30 fps 的速度依次显示它们。然而,我似乎遇到了 PCI-e IO 的问题。
我需要为每一帧加载一个存储在内存中的大点云,然后根据高度计算颜色图(我使用类似于 matlab 的喷射图),然后将数据传输到 GPU。这适用于点数 每秒大约 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 编程还是很陌生,所以任何建议都将不胜感激。
【问题讨论】:
-
你真的需要每帧发送所有数据吗?你不能在需要的时候更新高度,只在 GPU 上发送这个,然后在着色器中计算颜色吗?在 GPU 上无法完成的 CPU 更新有哪些?
-
我的问题是点云都是预先记录的,所以我只需要显示它们。我并没有真正做任何计算,所以我不能只更新东西:\
-
我和@Calvin1602有同样的想法。我不知道这是否有帮助:stackoverflow.com/questions/371898/… 但它的作用是比较新旧东西,找出差异,并在带宽存在问题时使用它们来更新“远程”数据结构。
标签: performance opengl optimization 3d lidar