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

OpenGL get pixel's original 3d coordinates

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

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

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

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

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

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

然后您可以使用 glBindFragDataLocation 将目标绑定到您的新输出。大概您已经对您的颜色输出进行了此操作。您的附加目标纹理可能需要是浮点纹理(GL_RGB32F 如果您的驱动程序支持它)。 'normal' 颜色目标 (GL_RGBA8) 没有足够的分辨率。

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

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