当我使用GL_TEXTURE_2D_MULTISAMPLE时,如何将深度缓冲区附加到帧缓冲区对象。 glCheckFramebufferStatus(msaa_fbo)
从下面的代码返回0.从文档中,这似乎意味着msaa_fba不是帧缓冲区,但它是从glGenFramebuffers(1, &msaa_fbo);
创建的。OpenGL如何使用多采样2d纹理将深度缓冲区附加到帧缓冲区
此外,如果发生错误,则返回零。 如果目标不是GL_DRAW_FRAMEBUFFER,GL_READ_FRAMEBUFFER或GL_FRAMEBUFFER,则会生成GL_INVALID_ENUM。
错误是1280,我认为这意味着GL_INVALID_ENUM。
如果我删除深度缓冲附件程序运行和渲染(虽然没有深度测试)。当它运行时,错误仍然存在。在包含深度附件的情况下,每个帧之后都有一个错误(1286),即INVALID_FRAMEBUFFER。我不知道如何从这里继续。我看过的一些例子有点相同,但似乎工作。
glGenTextures(1, &render_target_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, render_target_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_RGBA8, width, height, false);
glGenFramebuffers(1, &msaa_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, msaa_fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, render_target_texture, 0);
glGenRenderbuffers(1, &depth_render_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, depth_render_buffer);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, NUM_SAMPLES, GL_DEPTH_COMPONENT24, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depth_render_buffer);
GLenum status = glCheckFramebufferStatus(msaa_fbo);
大部分的代码是从this。
编辑
状态检查是错误的,它应该已经GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
。现在当我不包括深度时没有错误。当我包含深度时,我现在得到这个错误:GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
。
EDIT 2
文件称,出现这种情况时GL_TEXTURE_SAMPLES和GL_RENDERBUFFER:样本不匹配。返回
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE如果GL_RENDERBUFFER_SAMPLES的值不为所有连接renderbuffers相同;如果GL_TEXTURE_SAMPLES的值对于所有附加的纹理都不相同;或者,如果附加图像是渲染缓冲区和纹理的混合,则GL_RENDERBUFFER_SAMPLES的值与GL_TEXTURE_SAMPLES的值不匹配。
但他们呢!
我测试过他们这样的:
std::cout << "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" << std::endl;
GLsizei gts, grs;
glGetTexLevelParameteriv(GL_TEXTURE_2D_MULTISAMPLE, 0, GL_TEXTURE_SAMPLES, >s);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_SAMPLES, &grs);
std::cout << "GL_TEXTURE_SAMPLES: " << gts << std::endl;
std::cout << "GL_RENDERBUFFER_SAMPLES: " << grs << std::endl;
输出是:
GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
GL_TEXTURE_SAMPLES: 8
GL_RENDERBUFFER_SAMPLES: 8
编辑3
通过使用两个纹理代替的质地和围绕这个工作这样的渲染缓冲区:
glGenFramebuffers(1, &msaa_fbo);
glBindFramebuffer(GL_FRAMEBUFFER, msaa_fbo);
glGenTextures(1, &render_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, render_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_RGBA8, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, render_texture, 0);
glGenTextures(1, &depth_texture);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, depth_texture);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, GL_DEPTH_COMPONENT, width, height, false);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D_MULTISAMPLE, depth_texture, 0);
我仍然对原始实现有什么问题感兴趣,所以问题仍然存在。
多重采样深度纹理是一个DX10.1功能。当这些东西被添加到GL时,DX10.1是旧消息。因此,将多重采样纹理与多重采样渲染缓冲区进行混合匹配不应该特别特别。你只有两个附件的颜色附件在0和深度附件? –
@ AndonM.Coleman是的,除了给出的代码外没有其他附件。 – Jens