我有一个大点云,每个点都有{x,y,z,r,g,b}。 我可以从给定的相机姿势和视角查看点云,并将其保存到屏幕截图中。我需要根据这张图片对我的点云进行更改。
如何获得投影图像中每个像素的原始坐标?
基本上,我还希望存储每个像素的原始位置(或任何其他元数据),而不是仅仅投影像素上的每个点。
我想为每个视图保存N * M * 3(RGB)+ N * M * 3(坐标)而不是N * M * 3矩阵。 请注意,我每次都需要这些信息,并且计算开销不是问题。
答案 0 :(得分:0)
如果没有您的设置或要求的更多细节,我会假设您处于现代OpenGL(3.x +)环境中。在这种情况下,您可以简单地使用其他渲染目标,并将其他数据存储在其他(非颜色)目标中。
我会假设你的点云数据被传递给顶点(或几何着色器)。您需要将原始的x
,y
,z
值传递给带有varying
的片段着色器。向片段着色器添加其他out
参数,并将原始坐标写入新的out
参数。
然后,您可以使用glBindFragDataLocation
将目标绑定到新输出。大概你已经用你的颜色输出这样做了。您的其他目标纹理可能需要是浮点纹理(GL_RGB32F
,如果您的驱动程序支持它)。 “正常”颜色目标(GL_RGBA8
)没有足够的分辨率。
拍摄“截图”,您可以保存颜色输出和附加目标。颜色输出中的每个像素都对应于附加目标中的相同像素,您可以为其读取输出的原始点的坐标。如果您要使用GPU进行进一步处理,可以在同一像素处对两个纹理进行采样以进行对应。您需要决定如何实现“空”像素(例如,没有对象存在的像素)。
您可以为所需的任何其他元数据复制此内容,添加和绑定其他目标(假设您的设置支持足够的内容)。您可以拥有的最大输出数由GL_MAX_DRAW_BUFFERS
定义,但保证至少为8。