关于glReadPixels不读取iOS上的深度缓冲区值,这个问题可能是由于在iOS上,OpenGL ES的实现与桌面版本的OpenGL有所不同。在iOS上,glReadPixels默认只能读取颜色缓冲区的数据,而不能读取深度缓冲区的数据。
如果需要读取深度缓冲区的数据,可以使用扩展的拓展功能EXT_packed_depth_stencil和EXT_texture_storage来创建深度缓冲区和纹理对象,并将其绑定到帧缓冲区对象上。然后,可以使用glReadPixels函数读取深度缓冲区的数据。
以下是一个示例代码,展示了如何使用扩展功能创建深度缓冲区和纹理对象,并将其绑定到帧缓冲区对象上:
// 创建深度缓冲区和纹理对象
glGenRenderbuffers(1, &depthRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height);
glGenTextures(1, &depthTexture);
glBindTexture(GL_TEXTURE_2D, depthTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
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, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, NULL);
// 将深度缓冲区和纹理对象绑定到帧缓冲区对象上
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTexture, 0);
然后,可以使用glReadPixels函数读取深度缓冲区的数据:
GLfloat depthPixels[width * height];
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glReadPixels(0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depthPixels);
这样就可以成功读取iOS上的深度缓冲区值了。
领取专属 10元无门槛券
手把手带您无忧上云