Как отобразить цвет и глубину в многосэмплированной текстуре?

Чтобы реализовать «очистку по глубине», я рендерил свою сцену OpenGL в серию кадровых буферов, каждый из которых оснащен текстурой цвета rgba и текстурой глубины. Это отлично работает если я не забочусь о сглаживании. Если я это сделаю, то, кажется, правильнее всего включить GL_MULTISAMPLING и использовать GL_TEXTURE_2D_MULTISAMPLE вместо GL_TEXTURE_2D, Но я не понимаю, какие другие звонки нужно заменить.

В частности, как я должен адаптировать мою структуру кадрового буфера для использования glTexImage2DMultisample вместо glTexImage2D?

Нужно ли менять звонки на glFramebufferTexture2D вне использования GL_TEXTURE_2D_MULTISAMPLE вместо GL_TEXTURE_2D?

Если я рендерим в текстуры и цвет, и глубину, нужно ли мне glRenderbufferStorageMultisample?

Наконец, есть ли некоторые glBlit* что мне нужно сделать в дополнение к настройке текстур для рендеринга кадрового буфера?

Есть много связанные вопросы по этой теме, но ни одно из найденных мной решений, кажется, не указывает на каноническое руководство или ясный пример, объединяющий все это.

3

Решение

Хотя я использовал только мультисэмплинг-рендеринг FBO с рендер-буферами, а не с текстурами, я понимаю следующее.

Нужно ли менять звонки на glFramebufferTexture2D вне использования GL_TEXTURE_2D_MULTISAMPLE вместо GL_TEXTURE_2D?

Нет, это все, что тебе нужно. Вы создаете текстуру с glTexImage2DMultisample(), а затем прикрепите его с помощью GL_TEXTURE_2D_MULTISAMPLE в качестве третьего аргумента glFramebufferTexture2D(), Единственным ограничением является то, что уровень (5-й аргумент) должен быть 0.

Если я рендерим в текстуры и цвет, и глубину, нужно ли мне glRenderbufferStorageMultisample?

Да. Если вы присоединяете буфер глубины к тому же FBO, вам нужно использовать буфер мультисэмплирования с тем же количеством сэмплов, что и буфер цвета. Таким образом, вы создаете свой рендер-буфер глубины с glRenderbufferStorageMultisample(), передавая то же количество образцов, которое вы использовали для цветового буфера.

Наконец, есть ли некоторые glBlit* что мне нужно сделать в дополнение к настройке текстур для рендеринга кадрового буфера?

Не для рендеринга в кадровый буфер. Как только вы закончите рендеринг, у вас есть несколько вариантов:

  1. Вы можете уменьшить (разрешить) мультисэмплинг текстуры до обычной текстуры, а затем использовать обычную текстуру для последующего рендеринга. Для разрешения текстуры мультисэмпла вы можете использовать glBlitFramebuffer()где текстура мультисэмпла прикреплена к GL_READ_FRAMEBUFFERи обычная текстура для GL_DRAW_FRAMEBUFFER,

  2. Вы можете использовать мультисэмпловую текстуру для последующего рендеринга. Вам нужно будет использовать sampler2DMS введите сэмплеры в свой код шейдера с соответствующими функциями сэмплирования.

Для варианта 1 я не вижу веской причины использовать текстуру с несколькими образцами. Вы также можете использовать мультисэмпловый рендер-буфер, который немного проще в использовании и должен быть, по крайней мере, таким же эффективным. Для этого вы создаете буфер визуализации для цветного вложения и выделяете его glRenderbufferStorageMultisample()Очень похоже на то, что вам нужно для буфера глубины.

0

Другие решения