Объекты рендеринга кадра с множественной выборкой и буферы глубины

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

Я настроил свой обычный буфер кадра следующим образом

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);

Затем я также создаю кадровый буфер Multi-Sampling, подобный этому.

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 (которое работает, но с проблемами, упомянутыми ранее).

На самом деле застрял на этом этапе и нигде не могу найти решение!


person Calum McManus    schedule 07.02.2018    source источник
comment
Но если я раскомментирую этот раздел, я получу 36182 Вы получили это от чего? Это код ошибки OpenGL?   -  person Nicol Bolas    schedule 07.02.2018
comment
Извините, это дается из glCheckFramebufferStatus(GL_FRAMEBUFFER)   -  person Calum McManus    schedule 07.02.2018
comment
Кроме того, почему вы прикрепляете m_Texture к тому же месту прикрепления цвета, что и m_TexColorBuffer? У вас может быть только одно изображение для каждого места прикрепления; присоединение другого приведет к отсоединению предыдущего.   -  person Nicol Bolas    schedule 07.02.2018
comment
Насколько я понимаю, когда информация привязана к буферу кадра, я могу переопределить ее. Более того, односемпловый буфер кадров с этим кодом работает отлично, и я без проблем использовал его для создания таких эффектов, как цветение и виньетирование. Моя единственная проблема здесь - это правильный способ передать буфер глубины в буфер кадра с множественной выборкой.   -  person Calum McManus    schedule 08.02.2018
comment
Насколько я понимаю, как только информация будет привязана к буферу кадра, я смогу переопределить ее. Да. Я хочу сказать, что вы делаете эквивалент int i = 2; i = 4; Конечно, это устанавливает 4 в i, но если вы хотите поместить 4 в i, есть намного более разумный способ сделать это.   -  person Nicol Bolas    schedule 08.02.2018


Ответы (1)


Итак, я нашел ответ благодаря устаревшей документации для случайного проекта на исходной кузнице.

Моя ошибка была 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);
person Calum McManus    schedule 08.02.2018