正在设置 GL_TEXTURE_2D_ARRAY,帧缓冲区不完整
Setting up GL_TEXTURE_2D_ARRAY, framebuffer incomplete
对于级联阴影贴图,我正在尝试对单个阴影贴图使用 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/
我在这里做错了什么?为什么帧缓冲区不完整?
您引用的教程让您误入歧途。
二维纹理与二维数组纹理不同。您可以附上 specific array layer (of a specific mipmap level) to a framebuffer, or attach all of the array images in a mipmap。在这两种情况下,您都不能调用 glFramebufferTexture2D
为数组纹理执行此操作(这就是为什么您应该以一种或另一种方式检查 OpenGL 错误,因为此函数应该出错)。
无论如何,如果您想将特定的阵列层附加到帧缓冲区,那么您需要使用 glFramebufferTextureLayer
。如果您想将其附加为分层附件(因为您正在进行分层渲染),那么您将使用 glFramebufferTexture
.
对于级联阴影贴图,我正在尝试对单个阴影贴图使用 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/
我在这里做错了什么?为什么帧缓冲区不完整?
您引用的教程让您误入歧途。
二维纹理与二维数组纹理不同。您可以附上 specific array layer (of a specific mipmap level) to a framebuffer, or attach all of the array images in a mipmap。在这两种情况下,您都不能调用 glFramebufferTexture2D
为数组纹理执行此操作(这就是为什么您应该以一种或另一种方式检查 OpenGL 错误,因为此函数应该出错)。
无论如何,如果您想将特定的阵列层附加到帧缓冲区,那么您需要使用 glFramebufferTextureLayer
。如果您想将其附加为分层附件(因为您正在进行分层渲染),那么您将使用 glFramebufferTexture
.