【发布时间】:2014-03-07 19:04:19
【问题描述】:
我正在创建一个帧缓冲区对象作为延迟着色的 gbuffer。我主要从http://ogldev.atspace.co.uk/ 学习,并修改为更...理智一点。这是我创建帧缓冲区的源代码:
/* Create the FBO */
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
/* Create the gbuffer textures */
glGenTextures(GBUFFER_NUM_TEXTURES, tex);
/* Create the color buffer */
glBindTexture(GL_TEXTURE_2D, tex[GBUFFER_COLOR]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex[GBUFFER_COLOR], 0);
/* Create the normal buffer */
glBindTexture(GL_TEXTURE_2D, tex[GBUFFER_NORMAL]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RG16F, width, height, 0, GL_RG, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, tex[GBUFFER_NORMAL], 0);
/* Create the depth-stencil buffer */
glBindTexture(GL_TEXTURE_2D, tex[GBUFFER_DEPTH_STENCIL]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, width, height, 0, GL_DEPTH_STENCIL, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, tex[GBUFFER_DEPTH_STENCIL], 0);
GLenum drawBuffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, drawBuffers);
glReadBuffer(GL_NONE);
/* Check for errors */
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE)
{
error("In GBuffer::init():\n");
errormore("Failed to create Framebuffer, status: 0x%x\n", status);
fbo = 0;
return;
}
// restore default FBO
glBindFramebuffer(GL_FRAMEBUFFER, 0);
但是,当我运行它时,状态返回 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT。如果不清楚,我正在尝试创建 3 个 gbuffers:
- 32 位 RGBA 颜色缓冲区(我会使用 24 位,但我害怕对齐惩罚),
- 32 位 RG 普通缓冲区(每个组件都使用 16 位浮点数,但我可能会使用带符号的 short 吗?)
- 一个 24 位深度缓冲区,包含一个 8 位模板缓冲区
- (总共 96 位,或 12 个字节)
我可以看到的可能问题区域可能是将 GL_FLOAT 用于普通缓冲区,将 GL_FLOAT 用于深度模板缓冲区。我想 GL_HALF_FLOAT 会更适合法线,但这不在我可以与 glTexImage2D 一起使用的类型列表中。同样,我不知道哪种类型最适合用于深度模板缓冲区。
我做错了什么?
【问题讨论】:
-
对于深度模板纹理,GL_UNSIGNED_INT_24_8 似乎比 GL_FLOAT 更合适。
标签: c++ opengl framebuffer