0

我在我的 FBO 中从渲染缓冲区切换到深度纹理。但它似乎不包含任何深度数据。如果我将此纹理渲染到全屏四边形,一切都是黑色的。我很确定纹理和 FBO 设置没问题.FBO 已完成,如果我清除深度,让我们对灰色说:

glClearDepth(0.5f);

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

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

                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 片段着色器中线性化深度。它有效。现在我可以看到深度。但是我看到没有它的白色和一些灰色阴影。在快照中:左侧部分是使用线性化绘制的,而右侧部分是从深度采样的直接纹理。 在此处输入图像描述

4

1 回答 1

2

看起来还不错,也很正常。

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

深度数据,因为它是非线性的,您可以将其视为信息被压缩到更接近 1.0 的部分,因此如果您可以看到图像编辑器应用程序中的差异,那么大多数事物的值都是 0.9998 0.9997,但同样不是毕竟它应该如何显示。

要显示深度,您需要对其进行线性化,以便“有意义”,因为您需要考虑近/远平面,在这种情况下 White == far , Dark ( Black ) == close。

于 2013-10-14T19:20:29.933 回答