使用iOS模拟器Getting the true z value from the depth buffer渲染深度缓冲区时,一切都很好。 但是真实设备上的渲染会产生不好的结果:只有很少的值(没有淡入淡出)渲染深度,就像将图像显示为256值的颜色范围一样。
以下是fbo生成的代码:
glGenFramebuffers(1, &sceneFBO);
glGenTextures(2, textures_scene);
glBindTexture(GL_TEXTURE_2D, textures_scene[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, widthResolution, heightResolution, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, textures_scene[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, widthResolution, heightResolution, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
//TODO: GL_DEPTH_COMPONENT cannot be GL_UNSIGNED_BYTE ?
glBindFramebuffer(GL_FRAMEBUFFER, sceneFBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures_scene[0], 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textures_scene[1], 0);
似乎GL_DEPTH_ATTACHMENT fbo的唯一工作值是GL_UNSIGNED_INT。但这还不足以呈现深度......
PS:我不想再次将场景显示到带有z值的GL_COLOR_ATTACHMENT0中以获得正确的深度(出于性能原因),也不想使用OpenGL ES3.0或新的金属(iPhone4s)支持)。
有什么想法吗?
答案 0 :(得分:1)
ES 1或2中没有深度缓冲支持。请参阅此问题的答案:glReadPixels doesn't read depth buffer values on iOS
答案 1 :(得分:1)
似乎,它不能将GL_UNSIGNED_BYTE
与类型参数一起用作内部格式 GL_DEPTH_COMPONENT
,只有{{根据{{1}}扩展规范允许1}}和GL_UNSIGNED_SHORT
:https://www.khronos.org/registry/gles/extensions/OES/OES_depth_texture.txt
答案 2 :(得分:0)
我最终将z值放在场景的alpha部分(我不会为此fbo使用透明度)。
color.w=(gl_postion.z-near)/(far-near)
一点点mcgyver,但它完成了这项工作。