FBO Depth纹理可视化问题

时间:2013-10-14 11:01:38

标签: opengl glsl

我在FBO中从渲染缓冲区切换到深度纹理。但它看起来并不包含任何深度数据。如果我将此纹理渲染为全屏四边形,一切都是黑色的。我很确定纹理并且FBO设置正常.FBO已经完成,如果我清楚深度,请告诉灰色:

glClearDepth(0.5F);

然后我看到blit传递中的颜色,但不是几何渲染中的数据。

无论如何,这就是我创建纹理的方式:

                glBindTexture   ( GL_TEXTURE_2D, _id );
            glTexStorage2D(GL_TEXTURE_2D,1,intFmt,theWidth,theHeight);          
        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);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
        glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);   


        glBindTexture(_target,0);

其中intFmt是GL_DEPTH_COMPONENT24或GL_DEPTH_COMPONENT32(试过两个..)

这就是我将其附加到FBO的方式:

     glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);
         glBindTexture(GL_TEXTURE_2D, _id);
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, target,_id, 0);

这是blit pass片段着色器:

#version 420 
layout(binding=0) uniform sampler2D COLOR_MAP_0;
smooth in vec2 uvsOut;
out vec4 OUTPUT;

void main(void) {

    ivec2 tsize = textureSize(COLOR_MAP_0, 0);
    vec2 screntc = gl_FragCoord.xy * (1.0 / vec2(tsize));
    OUTPUT =  vec4(texture(COLOR_MAP_0, screntc).rrr   ,1) ;

}

也许我应该在片段着色器中明确写入深度?

我尝试在blit片段着色器中线性化深度。它工作。现在我可以看到深度。但是我看到没有它的白色和一些灰色阴影。在快照中:左侧部分使用线性化而右侧部分绘制直接从深度纹理采样。 enter image description here

1 个答案:

答案 0 :(得分:2)

看起来没关系,正常。

您必须记住,DEPTH不是RGB数据,也不是线性的,实际格式取决于您请求的内容(在OpenGL上下文创建中)或您为FBO创建的缓冲区/纹理。 DEPTH始终是单通道数据,但片段着色器允许您访问,但是.rgb将返回数据,但它将不正确。

DEPTH数据,因为它是非线性的,你可以把它想象成信息被压缩到更接近1.0的部分,所以大多数东西的值都是0.9998 0.9997,如果你能看到图像编辑器应用程序的差异,但又一次它毕竟不是应该如何显示的方式。

要显示深度,您需要对其进行线性化,使其“有意义”,因为您需要考虑近/远平面,在这种情况下,白色==远,黑色(黑色)==关闭。