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

问题描述 投票:0回答:2

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

更新:在渲染循环之前附加所有立方体面纹理

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()
}
c++ opengl framebuffer depth
2个回答
-1
投票

让我们先处理一下容易犯的错误:

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

这是错误的,你当然应该使用

texhandle
来附加特定的纹理对象(到当前绑定的
GL_FRAMEBUFFER
,那时将是
fbohandle
)。

但是,您似乎对分层帧缓冲区的工作原理有误解。每个 FBO 只有 one

GL_DEPTH_ATTACHMENT
,因此您只能将一个事物纹理对象(或渲染缓冲区)附加到它。

您的代码在概念上要做的事情(在修复上述错误之后)是将立方体贴图的每个面绑定为单个、无分层的深度附件,因此在循环之后,将附加最后一个立方体面,并且循环本身完全没有意义.

要使用分层渲染,您需要

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texobj, 0);

在立方体贴图的情况下,这将创建一个具有 6 层的深度附件,参考立方体贴图的侧面,更具体地说,参考所有这些的 mimap 级别 0。


-1
投票

我今天也遇到了同样的错误。我使用方形立方体贴图纹理解决了这个问题。宽度 = 高度。

glTexImage2D(
    GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
    GL_DEPTH_COMPONENT24, 1600, 900,         // replace width or height so they are equals
    0, GL_DEPTH_COMPONENT, GL_FLOAT, 0
);

替换为

glTexImage2D(
    GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0,
    GL_DEPTH_COMPONENT24, 1600, 1600,         // or 900, 900,
    0, GL_DEPTH_COMPONENT, GL_FLOAT, 0
);
© www.soinside.com 2019 - 2024. All rights reserved.