【问题标题】:OpenGL Depth Texture is the same as Color TextureOpenGL深度纹理与颜色纹理相同
【发布时间】:2017-04-05 14:11:42
【问题描述】:

我正在尝试在 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 个采样器在同一个位置。我确信这是不可能的

【问题讨论】:

  • 您在检查 gl 错误吗?我看到的第一件事是GL_DEPTH_ATTACHMENT 不是glDrawBuffers (ref) 的允许值之一,应该导致GL_INVALID_ENUM。但是,如果您的深度纹理中有颜色,则很有可能您正在渲染错误的纹理。由于您使用GL_DEPTH_COMPONENT,这是一个单通道纹理,不能存储任何颜色信息。显示渲染纹理的代码实际上是个好主意。
  • 正如 BDL 已经指出的那样,glDrawBuffers() 与深度缓冲区无关。您的问题缺少很多上下文。如果你想“看到”深度缓冲区。那么您确定将深度缓冲区绑定为纹理并在着色器中使用它吗?
  • 大家好,我已经用其他信息更新了上面的帖子,并且我已经摆脱了 drawBuffers 中的 GL_DEPTH_ATTACHMENT,老实说,我看不出问题出在哪里,也不知道这段代码是如何产生的颜色纹理输出...请看一下,提前谢谢!
  • 当我发布这个 - 发现它... glUniform1i(m_Shader->getDepthSampler(), 0); - 最后一个参数应该是1...我不敢相信...这种情况每次都会发生...我发布一个问题然后我发现问题...实际上是几分钟后...每次。这实际上变得令人尴尬.. :( 谢谢大家,对给您带来的不便深表歉意,

标签: opengl framebuffer depth-buffer


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,我知道我一发布 sn-p 并通读它就注意到了:P 奇怪的是我在 VS 中没有看到它,但我立即在 SO..以前也发生在我身上,发布了一个问题,然后几乎就解决了......尴尬
猜你喜欢
  • 2011-10-09
  • 2014-05-11
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多