为什么我不能使用FBO从深度纹理中获取值?

时间:2011-08-20 09:58:20

标签: opengl

我无法从FBO的深度纹理中获取深度值。程序的工作流程如下:

设置
1.制作pass1 FBO(颜色纹理+深度纹理)
2.制作pass2 RBO(彩色渲染缓冲器+深度渲染缓冲器)

渲染
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。当然,所有对象都在1.0到-1.0距离(NDC)之间,在gluPerspective()中,near和far值为1.0和2.0。

为什么我无法从FBO的深度纹理中获得正确的深度值?

2 个答案:

答案 0 :(得分:1)

您可以找到问题的答案in this article。当使用GL_COMPARE_R_TO_TEXTURE时,对深度纹理进行采样会返回深度纹理值与参考值(插值r纹理坐标)的比较结果。您要做的是改为指定以下纹理参数:

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);   

答案 1 :(得分:1)

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);

你使用了颜色纹理,pass1_tex [0]用于颜色和深度缓冲区