OpenGL 深度纹理与颜色纹理相同

OpenGL Depth Texture is the same as Color Texture

我正在尝试在 opengl 中可视化附加到自定义 fbo 的深度纹理。我希望看到 "foggy" 外观的灰度输出 - 问题是输出看起来与颜色纹理相同 - 我的意思是它是完全相同的颜色纹理。我实际上是将同一事物渲染成 2 种不同的纹理吗?

创建深度纹理:

    glGenTextures(1, &m_DepthTxId);
    glBindTexture(GL_TEXTURE_2D, m_DepthTxId);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, (void*)nullptr);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_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);

正在创建 fbo 并附加 color/depth 纹理:

    glGenFramebuffers(1, &m_Id);
    glBindFramebuffer(GL_FRAMEBUFFER, m_Id);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_ColorTxId, 0);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,  GL_TEXTURE_2D, m_DepthTxId, 0);
    m_DrawBuffers[0] = GL_COLOR_ATTACHMENT0;
    glDrawBuffers(1, m_DrawBuffers);

有趣的是,在不添加深度纹理的情况下,对象会按照渲染顺序显示(场景看起来一团糟)——但是当我添加深度纹理时,一切看起来都很好,就像你对深度的期望一样测试。

但是为什么当我将深度纹理赋予着色器时它只显示颜色纹理?我是将颜色数据渲染到我的深度纹理中,还是..?

抱歉,我对使用 fbos 还很陌生 :P

附加信息:

将 fbo 纹理渲染到四边形上:

    glActiveTexture(GL_TEXTURE0); // Color
    glBindTexture(GL_TEXTURE_2D, m_Fbo->getColorTxId()); // ColorTexture ID
    glUniform1i(m_Shader->getColorSampler(), 0); // ColorSampler Location

    glActiveTexture(GL_TEXTURE1); // Depth
    glBindTexture(GL_TEXTURE_2D, m_Fbo->getDepthTxId()); // DepthTexture ID
    glUniform1i(m_Shader->getDepthSampler(), 0); // DepthSampler Location

    glBindVertexArray(m_Fbo->getVaoId());
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, (void*)0);
    glBindVertexArray(0);

从着色器获取采样器位置:

    m_Location_ColorTxSampler = glGetUniformLocation(m_ProgramId, "colorSampler");
    m_Location_DepthTxSampler = glGetUniformLocation(m_ProgramId, "depthSampler");

着色器:

    in vec2 uv;

    uniform sampler2D colorSampler;
    uniform sampler2D depthSampler;

    out vec4 color;

    void main()
    {
        color = vec4(texture2D(depthSampler, uv).rgb, 1.0);
    }

对我来说,整件事似乎都是正确的,除非 2 个采样器在同一位置。我敢肯定那是不可能的

如果将深度纹理绑定到单元 1...

glActiveTexture(GL_TEXTURE1); // Depth
glBindTexture(GL_TEXTURE_2D, m_Fbo->getDepthTxId()); // DepthTexture ID

...你不应该告诉着色器从单元 0 采样:

glUniform1i(m_Shader->getDepthSampler(), 0); // DepthSampler Location