多采样框架渲染对象和深度缓冲区

Multi-sampling Frame Render Objects and Depth Buffers

本文关键字:深度 缓冲区 对象 采样 框架      更新时间:2023-10-16

我正在尝试使我的框架缓冲区(用于后处理(进行多抽样。我可以通过忽略深度缓冲区几乎可以使它起作用,但是我会发现面部不渲染的问题。

我像这样设置了我的普通帧缓冲区

glBindTexture(GL_TEXTURE_2D, m_Texture);
    glTexImage2D(
        GL_TEXTURE_2D, 0, GL_RGB, 1280, 720, 0, GL_RGB, GL_UNSIGNED_BYTE, 0
    );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    glFramebufferTexture2D(
        GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_Texture, 0
    );
    // Create color render buffer
    glGenRenderbuffers(1, &m_TexColorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_TexColorBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB, 1280, 720);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_TexColorBuffer);
    // Create depth render buffer (This is optional)
    glGenRenderbuffers(1, &m_RBODepthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_RBODepthBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 1280, 720);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RBODepthBuffer);
然后,

i也创建了这样的多抽样框架缓冲区。

glEnable(GL_MULTISAMPLE);
    glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_Texture);
    glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, 1280, 720, GL_FALSE);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, m_Texture, 0);
    glGenRenderbuffers(1, &m_TexColorBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_TexColorBuffer);
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_RGB, 1280, 720);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_TexColorBuffer);
/*  glGenRenderbuffers(1, &m_RBODepthBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, m_RBODepthBuffer);
    glRenderbufferStorageMultisample(GL_RENDERBUFFER, samples, GL_DEPTH_COMPONENT24, 1280, 720);
    glFramebufferRenderbuffer(
        GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_RBODepthBuffer
    );*/
    glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, m_Texture, 0);

此代码(带有深度缓冲区的注释部分(确实产生了正确显示的多样采样纹理,但没有深度,我就不会朝错误的方向渲染或正常(因此,从模型内看到的角度,(。但是,如果我不加句子,那就

glCheckFramebufferStatus(GL_FRAMEBUFFER)

返回

36182

接着

Error 00000506 after convex fill

最终是黑屏。

我正在使用glblitframebuffer将多样本FBO复制到单样本FBO(可有效,但与之前提到的问题一起使用(。

真的卡在这一点上,无法在任何地方找到解决方案!

,所以我找到了答案,这要归功于源伪造的随机项目过时的文档。

我的错误是GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE

有了该信息,我发现了错误的含义

GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE is also returned if the value of GL_TEXTURE_FIXED_SAMPLE_LOCATIONS is not the same for all attached textures; or, if the attached images are a mix of renderbuffers and textures, the value of GL_TEXTURE_FIXED_SAMPLE_LOCATIONS is not GL_TRUE for all attached textures.

因此在

末尾更改gl_false
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, 1280, 720, GL_FALSE);

gl_true修复了它。所以

glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, samples, GL_RGB, 1280, 720, GL_TRUE);