多样本帧缓冲区仅与渲染缓冲区不完整

Posted

技术标签:

【中文标题】多样本帧缓冲区仅与渲染缓冲区不完整【英文标题】:Multisample framebuffer only incomplete with renderbuffer 【发布时间】:2016-03-01 23:23:14 【问题描述】:

我正在设置一个带有 4 个颜色附件和 1 个深度模板附件的多重采样帧缓冲区。它目前不完整,带有 GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE。如果我不附加渲染缓冲区,它会完美运行。调试输出没有打印任何内容,并且 glGetError() 没有显示任何问题。

GLint samples;
glGetIntegerv(GL_MAX_SAMPLES, &samples);

const GLuint target = GL_TEXTURE_2D_MULTISAMPLE;
const GLenum format[TEXTURES_PER_FBO] = 
    GL_RGBA32F, GL_RGB32F, GL_RGB32F, GL_R8UI   // TODO tune these
;

// create render textures
glGenTextures(NUM_TEXTURES, textures);
for (int i = 0; i < NUM_TEXTURES; i++) 
    glActiveTexture(GL_TEXTURE0 + i);
    glBindTexture(target, textures[i]);
    const int index = i % TEXTURES_PER_FBO;
    glTexStorage2DMultisample(target, samples, format[index], width, height, false);


glGenRenderbuffers(1, &depth);
glBindRenderbuffer(GL_RENDERBUFFER, depth);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH24_STENCIL8, width, height);

// create first framebuffer with depth attachment
glGenFramebuffers(NUM_FBOS, fbos);
glBindFramebuffer(GL_FRAMEBUFFER, fbos[0]);
for (int i = 0; i < TEXTURES_PER_FBO; i++) 
    const GLenum index = GL_COLOR_ATTACHMENT0 + i;
    glFramebufferTexture2D(GL_FRAMEBUFFER, index, target, textures[i], 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depth);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);

“状态”是 GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

我已经在 Windows 上的 gtx 980 和 480 上对其进行了测试。我目前无法访问其他人,但如果没有解决,我会尝试获取一些。 如果您需要更多上下文代码,可以找到here 谢谢!

【问题讨论】:

【参考方案1】:

如果您还具有渲染缓冲区附件,则需要为 glTexStorage2DMultisample()fixedsamplelocations(最后一个)参数传递 GL_TRUE。否则,您将得到您观察到的 GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE 错误。

从规范中可能的glCheckFramebufferStatus() 结果列表(例如,OpenGL 4.5 规范的第 311 页,“9.4.2 整个帧缓冲区完整性”部分):

TEXTURE_FIXED_SAMPLE_LOCATIONS 的值对于所有附加的纹理都是相同的;并且,如果附加图像是渲染缓冲区和纹理的混合,则所有附加纹理的 TEXTURE_FIXED_SAMPLE_LOCATIONS 的值必须为 TRUE。 FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

因此您需要更改对 this 的调用以获得有效的 FBO 配置:

glTexStorage2DMultisample(target, samples, format[index], width, height, GL_TRUE);

【讨论】:

以上是关于多样本帧缓冲区仅与渲染缓冲区不完整的主要内容,如果未能解决你的问题,请参考以下文章

创建没有帧缓冲区绑定的 Opengl 渲染缓冲区

OpenGLES 2.0 帧缓冲区可以同时绑定到纹理和渲染缓冲区吗?

WebGL - 从渲染缓冲区读取像素数据

OpenTK 屏幕外帧缓冲区扭曲并使用相同的材​​料不正确地渲染?

WebGL2:不完整的帧缓冲区

OpenGL 帧缓冲区缺失面