设置opengl fbo以渲染到立方体贴图深度纹理时,为什么会出现不完整的附件?

时间:2016-12-13 05:10:26

标签: c++ opengl framebuffer depth

我正在尝试将场景的深度渲染到立方体贴图纹理,但在检查帧缓冲状态时,它返回GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,当然不会进行渲染。显然我错过了一些东西,但我似乎无法弄明白,我希望有人可以帮助我。我的显卡是支持OpenGL 4.5的NVIDIA GeForce 840M。下面是我如何设置渲染到fbo。

更新:在渲染循环

之前附加所有cubefacetextures
GLuint texhandle;
glGenTextures(1, &texhandle);
glBindTexture(GL_TEXTURE_CUBE_MAP, texhandle);
for (int i = 0; i < 6; i++) {
    glTexImage2D(
        GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
        GL_DEPTH_COMPONENT24, 1600, 900,
        0, GL_DEPTH_COMPONENT, GL_FLOAT, 0
    );
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

GLuint fbohandle;
glGenFramebuffers(num, &fbohandle);
glBindFramebuffer(GL_FRAMEBUFFER, fbohandle);
glCullFace(GL_BACK);

for (int i = 0; i < 6; i++) {   
    glFramebufferTexture2D(
        GL_FRAMEBUFFER, 
        GL_DEPTH_ATTACHMENT, 
        GL_TEXTURE_CUBE_MAP_POSITIVE_X + i,    
        fbohandle, 
        0
    );
}

for (int i = 0; i < 6; i++) {
    GLenum cubemapSide = GL_TEXTURE_CUBE_MAP_POSITIVE_X + i;
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, cubemapSide, fbohandle, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glDrawBuffer(GL_NONE);
    CheckFramebufferStatus();
    RenderScene()
}

1 个答案:

答案 0 :(得分:0)

让我们先处理容易出错的错误:

glFramebufferTexture2D(..., fbohandle, ...);

这是错误的,你当然应该使用texhandle来附加特定的纹理对象(到当前绑定的GL_FRAMEBUFFER,那时将是fbohandle

但是,您似乎对分层帧缓冲区的工作方式存在误解。每个FBO只有一个 GL_DEPTH_ATTACHMENT,因此您只能将一个纹理对象(或渲染缓冲区)附加到其上。

你的代码在概念上会做什么(在修复上面的错误之后)将立方体贴图的每个面绑定为单个,无层次的深度附件,因此在循环之后,最后一个立方体面被附加,并且循环本身是完全没有意义。

要使用分层渲染,您需要

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texobj, 0);

在立方体贴图的情况下,将创建一个深度附件,其中6个图层引用立方体贴图的边,更具体地说是所有这些的mimap等级0。