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

可以使用具有立方贴图颜色附件的深度渲染缓冲区吗?

如何解决可以使用具有立方贴图颜色附件的深度渲染缓冲区吗?

我正在尝试创建一个帧缓冲区,其中GL_TEXTURE_CUBE_MAP作为颜色附件,而GL_DEPTH24_STENCIL8作为帧缓冲区的渲染缓冲区的深度附件。

我坚信这会奏效,就像对带有GL_TEXTURE_2D颜色附件的帧缓冲区和以GL_DEPTH24_STENCIL8作为深度组件的渲染缓冲区一样。但是,它对于GL_TEXTURE_CUBE_MAP颜色附件似乎不起作用,因为我收到了Framebuffer Incomplete错误。另外,请注意,我正在尝试一次创建多个Framebuffer。

glGenFramebuffers(5,&FBO[0]);
glGenTextures(5,&FBO_texture[0]);
glGenRenderbuffers(5,&FBO_Renderbuffer[0]);

for (unsigned int i = 0; i < 5; i++)
{
    glBindTexture(GL_TEXTURE_CUBE_MAP,FBO_texture[i]);
    for (unsigned int j = 0; j < 6; j++)
    {
        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + j,GL_R16F,shadow_map_width,shadow_map_height,GL_RED,GL_FLOAT,NULL);
    }

    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_T,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);

    glBindFramebuffer(GL_FRAMEBUFFER,FBO[i]);

    glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,FBO_texture[i],0);

    glBindRenderbuffer(GL_RENDERBUFFER,FBO_Renderbuffer[i]);
    glrenderbufferStorage(GL_RENDERBUFFER,GL_DEPTH24_STENCIL8,shadow_map_height);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER,GL_DEPTH_STENCIL_ATTACHMENT,GL_RENDERBUFFER,FBO_Renderbuffer[i]);

    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        LOGGER->log(ERROR,"Renderer :  createFrameBuffers ","Framebuffer is incomplete!");

    glBindFramebuffer(GL_FRAMEBUFFER,0);
    glBindRenderbuffer(GL_RENDERBUFFER,0);
}

我不明白为什么会收到Framebuffer不完整的错误。我在这里想念东西吗?

解决方法

否。

您必须为深度缓冲区附件创建GL_TEXTURE_CUBE_MAP格式为GL_DEPTH24_STENCIL8的纹理。例如:

glGenFramebuffers(5,&FBO[0]);
glGenTextures(5,&FBO_texture[0]);
glGenTextures(5,&FBO_depth_texture[0]);

for (unsigned int i = 0; i < 5; i++)
{
    glBindTexture(GL_TEXTURE_CUBE_MAP,FBO_texture[i]);
    for (unsigned int j = 0; j < 6; j++)
    {
        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + j,GL_R16F,shadow_map_width,shadow_map_height,GL_RED,GL_FLOAT,NULL);
    }
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_MAG_FILTER,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP,GL_TEXTURE_WRAP_T,GL_TEXTURE_WRAP_R,GL_CLAMP_TO_EDGE);

    glBindTexture(GL_TEXTURE_CUBE_MAP,FBO_depth_texture[i]);
    for (unsigned int j = 0; j < 6; j++)
    {
        glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + j,GL_DEPTH24_STENCIL8,GL_DEPTH_STENCIL,GL_CLAMP_TO_EDGE);

    glBindFramebuffer(GL_FRAMEBUFFER,FBO[i]);
    glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,FBO_texture[i],0);
    glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_STENCIL_ATTACHMENT,FBO_depth_texture[i],0);

    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
        LOGGER->log(ERROR,"Renderer :  createFrameBuffers ","Framebuffer is incomplete!");

    glBindFramebuffer(GL_FRAMEBUFFER,0);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。