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

时间:2017-04-05 14:11:43

标签: opengl framebuffer depth-buffer

我正在尝试将附加到opengl中的自定义fbo的深度纹理可视化。我希望看到一个“模糊”的灰度输出 - 问题是输出看起来和颜色纹理一样 - 我的意思是它是完全相同的颜色纹理。我实际上是将同样的东西渲染成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&附加颜色/深度纹理:

    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 个答案:

答案 0 :(得分:0)

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

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

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

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