OpenGL获取像素的原始3d坐标

时间:2017-02-21 13:34:17

标签: opengl point-clouds

我有一个大点云,每个点都有{x,y,z,r,g,b}。 我可以从给定的相机姿势和视角查看点云,并将其保存到屏幕截图中。我需要根据这张图片对我的点云进行更改。

如何获得投影图像中每个像素的原始坐标?

基本上,我还希望存储每个像素的原始位置(或任何其他元数据),而不是仅仅投影像素上的每个点。

我想为每个视图保存N * M * 3(RGB)+ N * M * 3(坐标)而不是N * M * 3矩阵。 请注意,我每次都需要这些信息,并且计算开销不是问题。

1 个答案:

答案 0 :(得分:0)

如果没有您的设置或要求的更多细节,我会假设您处于现代OpenGL(3.x +)环境中。在这种情况下,您可以简单地使用其他渲染目标,并将其他数据存储在其他(非颜色)目标中。

我会假设你的点云数据被传递给顶点(或几何着色器)。您需要将原始的xyz值传递给带有varying的片段着色器。向片段着色器添加其他out参数,并将原始坐标写入新的out参数。

然后,您可以使用glBindFragDataLocation将目标绑定到新输出。大概你已经用你的颜色输出这样做了。您的其他目标纹理可能需要是浮点纹理(GL_RGB32F,如果您的驱动程序支持它)。 “正常”颜色目标(GL_RGBA8)没有足够的分辨率。

拍摄“截图”,您可以保存颜色输出和附加目标。颜色输出中的每个像素都对应于附加目标中的相同像素,您可以为其读取输出的原始点的坐标。如果您要使用GPU进行进一步处理,可以在同一像素处对两个纹理进行采样以进行对应。您需要决定如何实现“空”像素(例如,没有对象存在的像素)。

您可以为所需的任何其他元数据复制此内容,添加和绑定其他目标(假设您的设置支持足够的内容)。您可以拥有的最大输出数由GL_MAX_DRAW_BUFFERS定义,但保证至少为8。