我正在尝试将附加到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个采样器位于同一位置..我确信这是不可能的
答案 0 :(得分:0)
如果将深度纹理绑定到单元1 ...
glActiveTexture(GL_TEXTURE1); // Depth glBindTexture(GL_TEXTURE_2D, m_Fbo->getDepthTxId()); // DepthTexture ID
...你不应该告诉着色器从单元0中采样:
glUniform1i(m_Shader->getDepthSampler(), 0); // DepthSampler Location