OpenGL ES Depth Buffer渲染(iOS模拟器VS真实设备)

时间:2015-03-17 20:30:37

标签: c++ ios opengl-es

使用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)支持)。

有什么想法吗?

3 个答案:

答案 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_SHORThttps://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,但它完成了这项工作。