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



我正在尝试可视化附加到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...

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

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

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

最新更新