代码之家  ›  专栏  ›  技术社区  ›  NeomerArcana

为什么我在这里得到一个GL\u FRAMEBUFFER\u不完整的\u附件?

  •  0
  • NeomerArcana  · 技术社区  · 8 年前

    我有以下代码。我正在尝试创建一个具有两个颜色附件和一个深度模具附件的多示例帧缓冲区。

    /* Generate Framebuffer and textures & renderbuffers */
    glGenFramebuffers(1, &m_framebuffer);
    glGenTextures(1, &m_fboColorAttachment);
    glGenTextures(1, &m_fboAdditionalInfo);
    
    glGenRenderbuffers(1,&m_fboRenderbufferDepthStencil);
    
    glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);
    
        /* setup color output 0 */
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_fboColorAttachment);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
            glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, renderDimensionsX, renderDimensionsY, GL_FALSE);
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, m_fboColorAttachment, 0);
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
    
        /* setup color output 1 */
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_fboAdditionalInfo);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
            glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
            glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_R32UI, renderDimensionsX, renderDimensionsY, GL_FALSE);
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D_MULTISAMPLE, m_fboAdditionalInfo, 0);
        glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);
    
        /* setup depth and stencil */
        glBindRenderbuffer(GL_RENDERBUFFER, m_fboRenderbufferDepthStencil);
        glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_DEPTH24_STENCIL8, renderDimensionsX, renderDimensionsY);
        glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_fboRenderbufferDepthStencil);
    
        auto status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
        if(status != GL_FRAMEBUFFER_COMPLETE)
        {
            std::wstring statusStr = L"WTF error";
            if(status == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
                statusStr = L"Attachment";
            else if(status == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
                statusStr = L"Missing attachment";
            else if(status == GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER)
                statusStr = L"Draw buffer";
            else if(status == GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER)
                statusStr = L"Read buffer";
            else if(status == GL_FRAMEBUFFER_UNSUPPORTED)
                statusStr = L"Unsupported";
            else if(status == GL_FRAMEBUFFER_UNDEFINED)
                statusStr = L"Undefined";
            else if(status == GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE)
                statusStr = L"Multisample";
            else if(status == GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS)
                statusStr = L"Layer targets";
            drawFuncLog << L"Framebuffer status: " << statusStr << L"\r\n";
        }
    
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    

    我要去接电话 GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 返回状态。据我所知,所有内容都已创建为多采样,多采样级别的数量与附件中的匹配。不完整的附件显然意味着我的附件之一是不完整的,我认为这是深度模具renderbuffer。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Rabbid76    8 年前

    OpenGL 4.6 API Core Profile Specification; 9.4.2 Whole Framebuffer Completeness; page 326 :

    如果满足以下所有条件,则绑定到目标的帧缓冲区对象称为帧缓冲区完成:

    • 价值 TEXTURE_FIXED_SAMPLE_LOCATIONS 对于所有附加的纹理都是相同的;并且,如果附加的图像是 混合渲染缓冲层和纹理 ,的值 纹理\固定\样本\位置 必须是 TRUE 对于所有附加的纹理。

    这意味着你必须通过考试 GL_TRUE ,到的最后一个参数 glTexImage2DMultisample

    glTexImage2DMultisample(
        GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA8, renderDimensionsX, renderDimensionsY, GL_TRUE);
    

    glTexImage2DMultisample(
        GL_TEXTURE_2D_MULTISAMPLE, 4, GL_R32UI, renderDimensionsX, renderDimensionsY, GL_TRUE);
    
    推荐文章