【发布时间】: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