微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用深度纹理渲染阴影贴图

如何解决无法使用深度纹理渲染阴影贴图

我正在尝试为我的渲染器做阴影映射。我跟着 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 outcomehere 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 举报,一经查实,本站将立刻删除。