2017-02-21 206 views
1

我有一个大的点云,每个点有{x,y,z,r,g,b}。 我能够从给定的相机姿态和视角查看点云,并将其保存到屏幕截图中。我需要根据此图像对我的点云进行更改。OpenGL获取像素的原始三维坐标

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

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

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

回答

0

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

我假设你的点云数据正在传递给一个顶点(或几何着色器)。您需要将原始的x,y,z值传递给varying的片段着色器。为片段着色器添加额外的out参数,并将原始坐标写入新的参数out

然后,您将通过使用glBindFragDataLocation将目标绑定到新输出。想必你已经在用你的色彩输出做这个了。您的额外目标纹理可能需要为浮点纹理(如果驱动程序支持,则为GL_RGB32F)。 “正常”颜色目标(GL_RGBA8)没有足够的分辨率。

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

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