使用 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支持)。
有什么想法吗?
最佳答案
ES 1 或 2 中不支持深度缓冲区。请参阅此问题的答案:glReadPixels doesn't read depth buffer values on iOS
关于c++ - OpenGL ES Depth Buffer渲染(iOS模拟器VS真机),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29109098/