我想在我的 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 相比,该值要低得多,并且不是线性比例。
这是通过代码实现的:CIImage *image = [CIImage imageWithCVImageBuffer:深度数据.深度数据映射];
有人有同样的问题吗?
最佳答案
看来您将像素数据类型指定为 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/