如何解决无法使用深度纹理渲染阴影贴图
我正在尝试为我的渲染器做阴影映射。我跟着 this video 并尝试了我能找到的任何代码。
首先,我尝试将深度渲染为颜色(GL_RGB)纹理,并且效果很好。然后,我尝试对深度(GL_DEPTH_COMPONENT)纹理执行相同操作,但失败了,我尝试检查深度纹理,但似乎没有任何数据(全为 0)。
我做了一些步骤来渲染纹理的深度(只有第一步有点不同(纹理的设置)):
第一步。创建 FrameBuffer 和颜色纹理:
public unsafe void Create_Texture_OK()//Not using DepthBuffer
{
FrameBufferID = glGenFramebuffer();
glBindFramebuffer(GL_FRAMEBUFFER,FrameBufferID);
TexID = glGenTexture();
glBindTexture(GL_TEXTURE_2D,TexID);
glTexImage2D(GL_TEXTURE_2D,GL_RGB,Width,Height,GL_UNSIGNED_BYTE,NULL);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_S,GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,TexID,0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
Debug.LogError("Something went wrong!: Code" + glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
glBindFramebuffer(GL_FRAMEBUFFER,0);
}
步骤 2。然后我正常渲染场景,但将帧缓冲区与 FrameBufferID 绑定
void Render_ShadowMap()
{
Matrix4 _LightSpace = Matrix4.PerspectiveProjection(Core.MainCamera.zNear,Core.MainCamera.zFar,Core.MainCamera.Width,Core.MainCamera.Height,Core.MainCamera.fov) * Matrix4.GetCameraTransform() * Attaching_GameObject.transform.GetTransform(OffSet);
ShadowShader.SetUniform("LightSpace",_LightSpace);
Debug.Log_Once(glGetProgramInfoLog(ShadowShader.Program));
glViewport(0,ShadowMap.Width,ShadowMap.Height);
glBindFramebuffer(GL_FRAMEBUFFER,ShadowMap.FrameBufferID);
//glBindFramebuffer(GL_FRAMEBUFFER,0); //enable to see the outcome on screen
glBindVertexArray(RenderMesh.Vao);
Draw();
}
这是我在这里用来渲染纹理深度的着色器。
#version 330 core
out vec4 FragColor;
float near = 0.1;
float far = 100.0;
float LinearizeDepth(float depth)
{
float z = depth * 2.0 - 1.0; // back to NDC
return (2.0 * near * far) / (far + near - z * (far - near));
}
void main()
{
float depth = LinearizeDepth(gl_FragCoord.z) / far; // divide by far for demonstration
gl_FragDepth = depth;
FragColor = vec4(vec3(depth),1.0);
}
在这一步中,我还检查了屏幕上的 the outcome 和 here is how the scene normally looks like。
步骤 3。使用纹理作为采样器,看看深度映射是否有效。
public unsafe static void Show_ShadowMap()
{
glBindFramebuffer(GL_FRAMEBUFFER,0);
glViewport(0,Core.Width,Core.Height);
glClearColor(0,1,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,ShadowMap.TexID);
gluseProgram(DebugShader.Program);
glBindVertexArray(DebugMesh.Vao);
glEnabLevertexAttribArray(0);
glEnabLevertexAttribArray(1);
glDrawElements(GL_TRIANGLES,DebugMesh.Indices.Length,GL_UNSIGNED_INT,NULL);
gldisabLevertexAttribArray(0);
gldisabLevertexAttribArray(1);
}
这是出错的步骤,在这一步中,如果我使用颜色纹理,它将起作用(有点,除了图像颠倒并且某些对象被其他对象覆盖),see the image ,但如果我改用深度纹理,它将不起作用。
有我用来设置深度纹理的代码,与 Step1 的架构基本相同,但我更改了纹理设置。
public unsafe void Create_Texture_Testing()
{
TexID = glGenTexture();
glBindTexture(GL_TEXTURE_2D,GL_DEPTH_COMPONENT,GL_FLOAT,GL_REPEAT);
FrameBufferID = glGenFramebuffer();
glBindFramebuffer(GL_FRAMEBUFFER,FrameBufferID);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D,0);
glDrawBuffer(GL_NONE);
glreadBuffer(GL_NONE);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
Debug.LogError("Something went wrong!: Code" + glCheckFramebufferStatus(GL_FRAMEBUFFER));
}
glBindFramebuffer(GL_FRAMEBUFFER,0);
}
我很确定问题出在深度纹理的设置上,但我已经尝试了所有方法,但都没有奏效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。