我正在尝试将场景的深度渲染到立方体贴图纹理,但在检查帧缓冲状态时,它返回GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT,当然不会进行渲染。显然我错过了一些东西,但我似乎无法弄明白,我希望有人可以帮助我。我的显卡是支持OpenGL 4.5的NVIDIA GeForce 840M。下面是我如何设置渲染到fbo。
更新:在渲染循环
之前附加所有cubefacetexturesGLuint 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()
}
答案 0 :(得分:0)
让我们先处理容易出错的错误:
glFramebufferTexture2D(..., fbohandle, ...);
这是错误的,你当然应该使用texhandle
来附加特定的纹理对象(到当前绑定的GL_FRAMEBUFFER
,那时将是fbohandle
。
但是,您似乎对分层帧缓冲区的工作方式存在误解。每个FBO只有一个 GL_DEPTH_ATTACHMENT
,因此您只能将一个纹理对象(或渲染缓冲区)附加到其上。
你的代码在概念上会做什么(在修复上面的错误之后)将立方体贴图的每个面绑定为单个,无层次的深度附件,因此在循环之后,最后一个立方体面被附加,并且循环本身是完全没有意义。
要使用分层渲染,您需要
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, texobj, 0);
在立方体贴图的情况下,将创建一个深度附件,其中6个图层引用立方体贴图的边,更具体地说是所有这些的mimap等级0。