ios - iOS OpenGLES 上 DisparityFloat16 像素格式的纹理采样器值

标签 ios opengl-es metal truedepth-camera avdepthdata

我想在我的 OpenGLES 项目中使用深度数据映射作为来自 iPhoneX 真实深度相机的纹理。下载了一些 Swift 示例,似乎可以在 Metal 上创建深度图并将其采样为 float 纹理。但在 OpenGLES 上,从深度缓冲区创建深度纹理的唯一方法是,

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

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

这是 OpenGLES 中的采样值 enter image description here

这是通过代码实现的:CIImage *image = [CIImage imageWithCVImageBuffer:深度数据.深度数据映射];

enter image description here

有人有同样的问题吗?

最佳答案

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

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

欲了解更多信息,Apple has examples of this exact thing 。他们使用 Metal,但主体也可以使用 OpenGL。 Here's a really nice tutorial一些示例代码也可以执行此操作。

关于ios - iOS OpenGLES 上 DisparityFloat16 像素格式的纹理采样器值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54994989/

相关文章:

iphone - 多个SKPayment交易

ios - 如何隐藏 View 的 subview ( float 操作按钮)以防止点击两个不同的区域

java - OpenGL ES glBlendFunc 硬件要求

opencv - 检测视频流中的皮肤

ios - 删除 TableView 中的数据(Swift)

ios - Realm -iOS : Object reference set to nil after save

iPhone/iOS 自定义控件

c++ - 是否有可移植的 OpenGL UI 库(按钮、列表、窗口、下拉列表等)?

swift - 快速使用 Metal 拍摄当前屏幕的快照

profiling - 如何在 Metal 上测量 GPU 时间?