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

Posted

技术标签:

【中文标题】OpenGL获取像素的原始3d坐标【英文标题】:OpenGL get pixel's original 3d coordinates 【发布时间】:2017-02-21 13:34:16 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于OpenGL获取像素的原始3d坐标的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL工作流程

opengl绘制三角形

OpenGL入门之渲染管线pipeline,着色器Shader

opengl如何获取一点的像素

将 Glut 鼠标坐标转换为 opengl

使用像素坐标的 OpenGL 子图像