设置 GL_TEXTURE_2D_ARRAY,帧缓冲区不完整

问题描述

对于级联阴影贴图,我尝试将 GL_TEXTURE_2D_ARRAY 用于单个阴影贴图。但是,按照在线找到的教程,甚至在教科书中查找内容,我似乎都无法创建一个有效的帧缓冲区,因为它总是出现 GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 错误

代码

glGenFramebuffers(1,&m_DepthMap.m_FrameBuffer);


glGenTextures(1,&m_DepthMap.m_DepthTexture);
glBindTexture(GL_TEXTURE_2D_ARRAY,m_DepthMap.m_DepthTexture);
glTexImage3D(
    GL_TEXTURE_2D_ARRAY,GL_DEPTH_COMPONENT32F,Renderer::m_ShadowMapResolution,3,GL_DEPTH_COMPONENT,GL_FLOAT,nullptr);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_BORDER);

glBindFramebuffer(GL_FRAMEBUFFER,m_DepthMap.m_FrameBuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,GL_TEXTURE_2D,m_DepthMap.m_DepthTexture,0);
glDrawBuffer(GL_NONE);
glreadBuffer(GL_NONE);

const int status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
    std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete!";
    throw 0;
}

告诉我这应该是正确的来源:

https://people.inf.elte.hu/plisaai/pdf/OpenGL%20Insights.pdf ,第 264 页

https://johanmedestrom.wordpress.com/2016/03/18/opengl-cascaded-shadow-maps/

在这里做错了什么?为什么帧缓冲区不完整?

解决方法

你引用的教程让你误入歧途。

2D 纹理与 2D 数组纹理不同。您可以将 specific array layer(特定 mipmap 级别的)附加到帧缓冲区,或附加 all of the array images in a mipmap。在这两种情况下,您都不能调用 glFramebufferTexture2D 为数组纹理执行此操作(这就是为什么您应该以一种或另一种方式检查 OpenGL 错误的原因,因为此函数应该已出错)。

无论如何,如果您想将特定的阵列层附加到帧缓冲区,那么您需要使用 glFramebufferTextureLayer。如果您想将其作为分层附件附加(因为您正在进行分层渲染),那么您可以使用 glFramebufferTexture