多重采样帧缓冲区仅与renderbuffer不完整

时间:2016-03-01 23:23:14

标签: c++ c++11 opengl opengl-3 opengl-4

我正在设置一个带有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);

&#39;状态&#39;是GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

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

1 个答案:

答案 0 :(得分:0)

如果您还有renderbuffer附件,则需要为GL_TRUE fixedsamplelocations (last)参数传递glTexStorage2DMultisample()。否则,您将完全收到您观察到的GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE错误。

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

  

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

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

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