多重采样帧缓冲区只与渲染缓冲区不完全
问题描述:
我设置了一个带有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
我已经测试过它既有GTX 980和480上的窗口。目前我无法访问其他人,但如果此问题没有解决,我会尝试获取一些信息。 如果你需要更多的上下文代码,可以发现here 谢谢!
答
您需要通过GL_TRUE
为fixedsamplelocations(最后)的glTexStorage2DMultisample()
说法,如果你也有渲染附着物。否则,您会收到您观察到的GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
错误。
从可能glCheckFramebufferStatus()
导致规范的列表(例如OpenGL的4.5规范,部分“9.4.2全帧缓冲区完整性”的311页):
TEXTURE_FIXED_SAMPLE_LOCATIONS的价值都是一样的附加纹理;并且,如果附加的图像是渲染缓冲区和纹理的混合,则对于所有附加的纹理,TEXTURE_FIXED_SAMPLE_LOCATIONS的值必须为TRUE。 {} FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
所以,你需要改变调用此获得有效的FBO配置:
glTexStorage2DMultisample(target, samples, format[index], width, height, GL_TRUE);