当前位置: 首页 > 知识库问答 >
问题:

FBO深度纹理可视化问题

沃念
2023-03-14

我在FBO中从渲染缓冲区切换到深度纹理。但它似乎不包含任何深度数据。如果我把这个纹理渲染成全屏的四边形,所有的东西都是黑色的。我非常确定纹理和FBO设置是好的。FBO已经完成,如果我清除了深度,让我们对格雷说:

glClearDepth(0.5f);

然后我看到了斑点通道中的颜色,但没有看到几何渲染中的数据。

总之,这就是我创建纹理的方式:

                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_component 24或GL_DEPTH_component 32(两者都尝试过)

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

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

这是blight 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) ;

}

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

共有1个答案

楚浩然
2023-03-14

这似乎很正常。

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

深度数据是非线性的,你可以把它看作是信息被压缩到接近1.0的部分,所以大多数东西的值都是0.9998 0.9997,如果你能看到图像编辑器应用程序中的差异,但它毕竟不是应该显示的方式。

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

 类似资料:
  • This class can be used to automatically save the depth information of a rendering into a texture. When using a WebGL 1 rendering context, DepthTexture requires support for the WEBGL_depth_texture exte

  • 我一直在尝试渲染到一个FBO,并将两个FBO渲染到屏幕上,但在合并两个FBO时进行深度测试失败。我尝试使用计算着色器合并纹理,但无法读取深度纹理的值(所有值都是值1,但渲染到FBO时深度测试有效)。有人知道我做错了什么,或者知道其他方法来合并两个FBO吗? 以下是我创建FBO的方式: 以下是我向FBO渲染的方式: 我尝试用glBindTexture绑定纹理(所有值均为1): 计算着色器: 我已尝试

  • 我试图将模具缓冲区放入纹理中,以便在延迟渲染器中使用。 但是,当我尝试使用

  • 我对多个渲染目标有一个奇怪的问题。我在FBO上附加了3种纹理:颜色、法线和位置。我可以正确渲染颜色和位置,但渲染正常纹理会产生(绿色和红色是旋转立方体的一部分): 在左下角,是将法线纹理渲染到四边形的结果。 在我的顶点着色器中,我将法线计算为:,在片段着色器中,我将其发射为:

  • 似乎很难找到有关如何在连续渲染通道的着色器中访问深度和模板缓冲区的信息。 在第一次渲染过程中,我不仅渲染颜色和深度信息,还使用模具操作来计算对象。为此,我使用了一个多渲染目标FBO,附带了颜色缓冲区和一个组合的深度模具缓冲区。所有这些都是纹理形式(不涉及渲染缓冲区对象)。 在第二次渲染过程中(当渲染到屏幕时),我想访问之前计算的每像素模板索引(但不一定是我正在绘制的相同像素),类似于您希望访问之前

  • 我想在FBO中加载两个纹理,其中一个纹理包含HDR图像,我的第一个目标是将图像从第一个纹理“复制”到第二个纹理(该纹理为空),并称为“下采样纹理”。 所以我创建FBO,加载我想用颜色_附件_0书写的纹理,并绑定它;然后初始化我的着色器程序并渲染一个四边形,其中包含我要在GL\u texture\u 0中读取的纹理。 然后我解开FBO并绑定“DownSamplingTex”,然后画一个四元组。 我不