设置 GL_TEXTURE_2D_ARRAY,帧缓冲不完整

Posted

技术标签:

【中文标题】设置 GL_TEXTURE_2D_ARRAY,帧缓冲不完整【英文标题】:Setting up GL_TEXTURE_2D_ARRAY, framebuffer incomplete 【发布时间】:2021-07-10 22:45:28 【问题描述】:

对于级联阴影贴图,我尝试将 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,
    0,
    GL_DEPTH_COMPONENT32F,
    Renderer::m_ShadowMapResolution,
    Renderer::m_ShadowMapResolution,
    3,
    0,
    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_NEAREST);
glTexParameteri(GL_TEXTURE_2D, 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/

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

【问题讨论】:

"告诉我这应该是正确的来源:" 第一个来源不使用您显示的代码。第二个来源确实如此,但它与您的代码一样错误,并且出于相同的原因。 【参考方案1】:

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

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

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

【讨论】:

以上是关于设置 GL_TEXTURE_2D_ARRAY,帧缓冲不完整的主要内容,如果未能解决你的问题,请参考以下文章

如何在视觉上定义将纹理数组附加到 FBO 的颜色附加点?

glTexSubImage3D 不更新纹理

QOpenGL纹理层数

OpenGL 3.2为什么我为glTexStorage3D收到INVALID_ENUM错误?

为 2D 纹理数组生成 mip 级别

OpenGL中分层渲染和多个渲染目标之间的混淆