Opengl 从帧缓冲区纹理渲染深度
我一直在尝试将SSAO(基于此处的教程:)添加到我的一个项目中,但我一直无法正确渲染深度 我已经创建了帧缓冲区纹理来绘制每个帧的深度。当我将纹理绘制到四边形时,纹理本身看起来是正确的,但我不知道如何正确地将其应用于整个场景 以下是常规场景的外观: 下面是应用的深度纹理: 目前在我的片段着色器中,我只使用常规纹理坐标(TexCoord0)绘制深度纹理。我想我需要改变这个,但我不知道该改成什么。 以下是相关片段着色器代码:Opengl 从帧缓冲区纹理渲染深度,opengl,textures,framebuffer,depth,depth-buffer,Opengl,Textures,Framebuffer,Depth,Depth Buffer,我一直在尝试将SSAO(基于此处的教程:)添加到我的一个项目中,但我一直无法正确渲染深度 我已经创建了帧缓冲区纹理来绘制每个帧的深度。当我将纹理绘制到四边形时,纹理本身看起来是正确的,但我不知道如何正确地将其应用于整个场景 以下是常规场景的外观: 下面是应用的深度纹理: 目前在我的片段着色器中,我只使用常规纹理坐标(TexCoord0)绘制深度纹理。我想我需要改变这个,但我不知道该改成什么。 以下是相关片段着色器代码: #version 330 core in vec2 TexCoord0
#version 330 core
in vec2 TexCoord0;
smooth in vec3 vNormal;
smooth in vec3 vWorldPos;
in mat4 ProjectionMatrix;
uniform sampler2D uDepthTex;
layout(location = 0) out vec4 FragColor;
void main()
{
FragColor = texture(uDepthTex, TexCoord0);
}
我有点不知道如何解决这个问题。我在网上读了很多示例代码,它们似乎使用常规纹理坐标来绘制深度
编辑:
以下是我的帧缓冲区设置代码:
glGenFramebuffers(1, &ssaoFramebufferID);
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFramebufferID);
glGenTextures(1, &ssaoDepthTextureID);
glBindTexture(GL_TEXTURE_2D, ssaoDepthTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
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);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, ssaoDepthTextureID, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
在常规绘制之前,我调用每个帧的深度传递代码:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFramebufferID);
glViewport(0, 0, 1024, 1024);
depthShader.Bind();
depthShader.SetUniformMatrixfv("depthMVP", camera.GetViewMatrix() * Matrix4::Perspective(60, aspectRatio, 0.1f, 10.0f));
DrawScene(true);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, width, height);
我的深度着色器,顶点:
#version 330 core
layout(location = 0) in vec3 Position;
uniform mat4 depthMVP;
void main() {
gl_Position = depthMVP * vec4(Position, 1.0);
}
片段:
#version 330 core
layout(location = 0) out float fragmentdepth;
void main() {
fragmentdepth = gl_FragCoord.z;
}
编辑2:
当前所在的glClear调用给了我一个完全黑色的纹理。将其放在第一个glViewport调用的下面,将显示我在上面显示的深度图像,不过:
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFramebufferID);
glViewport(0, 0, 1024, 1024);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
由于评论中的一些帮助,我成功地使它工作: 我的代码如下,片段着色器:
#version 330 core
in vec2 TexCoord0;
smooth in vec3 vNormal;
smooth in vec3 vWorldPos;
in mat4 ProjectionMatrix;
uniform sampler2D uDepthTex;
uniform float uWidth;
uniform float uHeight;
layout(location = 0) out vec4 FragColor;
void main()
{
vec2 res = gl_FragCoord.xy / vec2(uWidth, uHeight);
FragColor = texture(uDepthTex, res);
}
帧缓冲区创建:
glGenFramebuffers(1, &ssaoFramebufferID);
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFramebufferID);
glGenTextures(1, &ssaoDepthTextureID);
glBindTexture(GL_TEXTURE_2D, ssaoDepthTextureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 1024, 768, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
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);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
深度绘制代码:
glBindFramebuffer(GL_FRAMEBUFFER, ssaoFramebufferID);
glViewport(0, 0, 1024, 768);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
depthShader.Bind();
glDisable(GL_ALPHA_TEST);
depthShader.SetUniformMatrixfv("depthMVP", Matrix4::Perspective(60, aspectRatio, 0.1f, 10.0f) * camera.GetViewMatrix());
DrawScene();
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, width, height);
glEnable(GL_ALPHA_TEST);
您知道深度纹理的默认输出已经是:
vec4(r,r,r,1.0)
,对吗?您只需编写FragColor=texture(udephtex,TexCoord0)代码>。至于其他情况,GLSL着色器不会帮助解释这一点-设置深度缓冲区、投影矩阵、FBO等的代码实际上更相关。是的,我知道这一点。我的实际着色器要大得多,我只是删掉了不相关的东西(点光源等),这是一个疏忽。我已经用更多信息更新了我的问题。GL_DEPTH_TEXTURE_MODE
在GLSL 3.30中也被弃用。自GLSL 1.30(GL 3.0)以来,它一直被弃用。那就是我在第一条评论中提到的行为开始生效的时候,原因GL\u DEPTH\u TEXTURE\u MODE
被删除。我很确定这不是一个实际的问题,但是如果您通过像gDEBugger这样的东西运行此代码,它会给您与我所做的几乎相同的警告;)至于您的实际问题,您似乎从未清除FBO的深度缓冲区。您可以在代码中清除颜色/深度,但只有在绑定FBO进行“仅深度”过程之前。谢谢,我删除了GL_depth_TEXTURE_MODE调用。四处走动有时似乎会给我一个黑屏。我将更新我的问题以说明我的意思。顺便说一句,在将深度值写入片段输出之前,您可能需要对深度值进行线性化。否则,您将看不到它的正确可视化。啊,唯一一个对我起作用的深度缓冲区设置。谢谢