【发布时间】:2013-10-19 22:03:13
【问题描述】:
我无法从 FBO 的深度纹理中获取深度值。程序的工作流程如下:
设置
1.制作pass1 FBO(颜色纹理+深度纹理)
2.制作pass2 RBO(color renderbuffer + depth renderbuffer)
渲染
1.仅顶点处理(pass1)
2.从pass0 FBO的深度纹理中获取深度值
3. 使用先前的深度值进行顶点和片段处理
Setup.1 代码(创建 pass0 fbo)
glActiveTexture(GL_TEXTURE0);
glGenTextures(2, &pass1_tex);
glBindTexture(GL_TEXTURE_2D, pass1_tex[0]);
glTexImage2D(GL_TEXTURE_2D, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, pass1_tex[1]);
glTexImage2D(GL_TEXTURE_2D, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, 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);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
glGenFramebuffers(1, pass1_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMEMNT0, GL_TEXTURE_2D< pass1_tex[0], 0);
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMEMNT, GL_TEXTURE_2D< pass1_tex[0], 0);
为了在渲染中获得深度值,我做了如下操作:
glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo);
// vertex processing..
glActiveTexture(GL_TEXTURE1);
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &debug_buf[0]);
但是,debug_buf 数组中只有 1.0 或 0.0。当然,所有对象的距离(NDC)都在 1.0 和 -1.0 之间,gluPerspective() 中的近远值是 1.0 和 2.0。
为什么我不能从 FBO 的深度纹理中得到正确的深度值?
【问题讨论】:
-
嗯,你能发布实际编译的代码吗?
glBindFramebuffer将帧缓冲区绑定到上下文;它只需要两个参数。另外,如果那应该是glFramebufferTexture,那么您将使用与颜色和深度相同的纹理,我敢肯定这是不合法的。你在检查帧缓冲区的完整性吗?最后,当您尝试调用glGetTexImage时,您从未绑定过深度纹理 -
深度缓冲区将始终具有 [-1.0 .. 1.0] 的值范围,无论近值和远值如何(至少只要 near
标签: opengl