我想在我的OpenGLES项目上使用depthDataMap作为iPhoneX真实深度相机的纹理。已经下载了一些Swift样本,似乎depthMap可以在Metal上创建并采样为浮动纹理。但是在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:depthData.depthDataMap];
有人有同样的问题吗?
答案 0 :(得分:0)
看起来您将像素数据类型指定为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以及一些示例代码也可以做到这一点。