2015-11-07 146 views
0

当我使用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, &gts); 
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); 

我仍然对原始实现有什么问题感兴趣,所以问题仍然存在。

+0

多重采样深度纹理是一个DX10.1功能。当这些东西被添加到GL时,DX10.1是旧消息。因此,将多重采样纹理与多重采样渲染缓冲区进行混合匹配不应该特别特别。你只有两个附件的颜色附件在0和深度附件? –

+0

@ AndonM.Coleman是的,除了给出的代码外没有其他附件。 – Jens

回答

1

如果将纹理与渲染缓冲区混合使用,则需要使用纹理的固定样本位置。从规格中,在“帧缓冲区完整性”部分:

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

{} FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

为了避免这种错误状态,呼吁建立纹理存储需要被改为:

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 
    NUM_SAMPLES, GL_RGBA8, width, height, GL_TRUE); 
+0

这样做!谢谢。 – Jens