我正在尝试将场景的深度渲染到立方体贴图纹理,但在检查帧缓冲区状态后,它返回 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()
}
让我们先处理一下容易犯的错误:
glFramebufferTexture2D(..., fbohandle, ...);
这是错误的,你当然应该使用
texhandle
来附加特定的纹理对象(到当前绑定的GL_FRAMEBUFFER
,那时将是fbohandle
)。
但是,您似乎对分层帧缓冲区的工作原理有误解。每个 FBO 只有 one
GL_DEPTH_ATTACHMENT
,因此您只能将一个事物纹理对象(或渲染缓冲区)附加到它。
您的代码在概念上要做的事情(在修复上述错误之后)是将立方体贴图的每个面绑定为单个、无分层的深度附件,因此在循环之后,将附加最后一个立方体面,并且循环本身完全没有意义.
要使用分层渲染,您需要
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texobj, 0);
在立方体贴图的情况下,这将创建一个具有 6 层的深度附件,参考立方体贴图的侧面,更具体地说,参考所有这些的 mimap 级别 0。
我今天也遇到了同样的错误。我使用方形立方体贴图纹理解决了这个问题。宽度 = 高度。
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
);