0

我想在我的 OpenGLES 项目中使用 depthDataMap 作为 iPhoneX 真实深度相机的纹理。已经下载了一些 Swift 示例,似乎可以在 Metal 上创建 depthMap 并将其采样为浮动纹理。但是在 OpenGLES 上,从深度缓冲区创建深度纹理的唯一方法是,

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, depthWidth, depthHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, CVPixelBufferGetBaseAddress(depthBuffer));

样本值不同于从 DisparityFloat16 像素类型导出为 CIImage 的值。与 CIImage 相比,该值要低得多,并且不是线性比例。

这是 OpenGLES 中的采样值 在此处输入图像描述

这是通过代码:CIImage *image = [CIImage imageWithCVImageBuffer:depthData.depthDataMap];

在此处输入图像描述

有没有人有同样的问题?

4

1 回答 1

0

好吧,看起来您将像素数据类型指定为 GL_UNSIGNED_SHORT,尝试将其更改为 GL_HALF_FLOAT(如果使用 DisparityFloat16)或 GL_FLOAT(如果使用 DisparityFloat32)。

此外,如果要将深度缓冲区显示为纹理,则应将深度数据转换为在灰度图像中表示某种含义的值。如果您将深度缓冲区值标准化为 0 到 255 之间的整数,您的图片看起来会好很多。

有关更多信息,Apple 提供了这方面的示例。他们使用 Metal,但主体也可以与 OpenGL 一起使用。这是一个非常不错的教程,其中包含一些示例代码也可以做到这一点。

于 2019-03-09T15:53:15.957 回答