Почему я получаю здесь GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT? - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть следующий код. Я пытаюсь создать многосэмпловый кадровый буфер, который имеет два цветовых вложения и вложение трафарета глубины.

/* 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. Насколько я могу судить, все было создано как мультисэмплирование, и количество уровней мультисэмплирования совпадает для всех вложений. Incomplete Attachment, очевидно, означает, что одно из моих вложений является неполным, и я думаю, что это буфер рендеринга глубины трафарета.

1 Ответ

0 голосов
/ 08 сентября 2018

См. Спецификация профиля ядра API OpenGL 4.6; 9.4.2 Полнота всего фреймбуфера; страница 326 :

Объект framebuffer, связанный с целью, называется завершенным, если выполняются все следующие условия:
......

  • Значение TEXTURE_FIXED_SAMPLE_LOCATIONS одинаково для всех прикрепленных текстур; и, если прикрепленные изображения представляют собой смесь визуализирующих буферов и текстур , значение 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...