Что такое мультисэмплинг в assassins creed brotherhood
Что такое Мультисэмплинг?
Избыточная выборка сглаживания (англ. Super Sampling anti-aliasing, SSAA) [1], также называемое полносценным или полноэкранным сглаживанием (FSAA)[2], используется, для исправления алиасинга (или «зубцов» ) на полноэкранных изображениях. [3] SSAA было доступно на ранних видеокартах, вплоть до DirectX 7. Начиная с DirectX 8 было убрано всеми производителями графических процессоров из-за его огромных вычислительных требований, и было заменено на множественную выборку сглаживания (англ. Multisample anti-aliasing, MSAA), которое также было заменено другими методам, такими как CSAA + TrAA/AAA. MSAA даёт несколько худшее качество графики, но и даёт огромную экономию вычислительной мощности. Поскольку SSAA даёт более высокое качество изображения, поэтому оно было некоторое время тому назад возвращено у AMD и NVIDIA. В модельный ряд AMD HD6xxx он включён в качестве особенности (ограничено только для игр на DirectX 9), также он был выпущен драйверами NVIDIA Fermi, для всех игр, начиная с игр на DirectX 9, и заканчивая играми на DirectX 11 с использованием любых видеокарт NVIDIA с поддержкой DX10+. Из-за больших вычислительных требований, с ним можно запустить только старые игры, которые значительно меньше используют графический процессор.
Полноэкранное сглаживание позволяет устранить характерные «лесенки» на границах полигонов. Но следует учитывать, что полноэкранное сглаживание потребляет немало вычислительных ресурсов, что приводит к падению частоты кадров.
Сглаживание очень сильно зависит от производительности видеопамяти, поэтому скоростная графическая плата с быстрой памятью сможет просчитать полноэкранное сглаживание с меньшим ущербом для производительности, чем графическая карта более низкого класса. Сглаживание можно включать в различных режимах. Например, сглаживание 4x даст более качественное изображение, чем сглаживание 2x, но значительно снизит производительность. Тогда как сглаживание 2x удваивает горизонтальное и вертикальное разрешение, режим 4x его учетверяет.
Что такое мультисэмплинг в assassins creed brotherhood
Assassin’s Creed
Hi all, I’ve searched around a way to twak the multisampling issue at high resolutions (I’m 1920×1080 on a 24″ 144hz monitor + a GTX 770), and I cannot set the multisampling higher then 1 on 3.
Thanks for the help!
In the Assassin.ini, set Multisampling to 2 which is 3/3 I think.
In the Assassin.ini, set Multisampling to 2 which is 3/3 I think.
Sorry for the necro; but ive gone into the config and also seen ‘DistanceLOD=0’ the one below ‘MaxNPCLODLevel=5’ I’m guessing 2 or 5 will work.
Anyone else know of any config changes that you can do to make it visually better?
СОДЕРЖАНИЕ
Определение
В графической литературе в целом, «мультисэмплинг» относится к любому частному случаю суперсэмплинга, когда некоторые компоненты конечного изображения не полностью суперсэмплированы. Приведенные ниже списки относятся к определению ARB_multisample.
Описание
При сглаживании суперсэмплов в каждом пикселе производится выборка из нескольких мест, и каждая из этих выборок полностью визуализируется и комбинируется с другими для получения пикселя, который в конечном итоге отображается. Это затратно с точки зрения вычислений, потому что весь процесс рендеринга должен повторяться для каждого местоположения образца. Это также неэффективно, поскольку сглаживание обычно наблюдается только в некоторых частях изображения, таких как края, тогда как суперсэмплинг выполняется для каждого отдельного пикселя.
При сглаживании с несколькими выборками, если какое-либо из местоположений с несколькими выборками в пикселе покрывается визуализируемым треугольником, для этого треугольника необходимо выполнить вычисление затенения. Однако этот расчет необходимо выполнить только один раз для всего пикселя, независимо от того, сколько позиций сэмпла покрыто; результат вычисления затенения просто применяется ко всем релевантным местоположениям с несколькими образцами.
В случае, когда только один треугольник покрывает каждое местоположение с несколькими выборками в пикселе, выполняется только одно вычисление затенения, и эти пиксели немного дороже (и результат не отличается), чем в изображении без сглаживания. Это верно для середины треугольников, где сглаживание не является проблемой. ( Обнаружение краев может еще больше уменьшить это, явно ограничивая вычисление MSAA пикселями, образцы которых включают несколько треугольников, или треугольники на разной глубине.) В крайнем случае, когда каждое из местоположений нескольких образцов покрывается другим треугольником, другое вычисление затенения будет выполняться для каждого местоположения, а затем результаты объединяются для получения окончательного пикселя, а результат и затраты на вычисления такие же, как и в эквивалентном сверхдискретизированном изображении.
Преимущества
Недостатки
Альфа-тестирование
Сглаживание
Поскольку множественная выборка вычисляет внутренние фрагменты многоугольника только один раз на пиксель, сглаживание и другие артефакты по-прежнему будут видны внутри визуализированных многоугольников, где выходные данные фрагментного шейдера содержат высокочастотные компоненты.
Спектакль
Методы отбора проб
Точечный отбор проб
В маске с точечной выборкой бит покрытия для каждого мультисэмпла устанавливается только в том случае, если мультисэмпл находится внутри визуализированного примитива. Образцы никогда не берутся извне визуализированного примитива, поэтому изображения, созданные с использованием точечной выборки, будут геометрически правильными, но качество фильтрации может быть низким, поскольку доля битов, установленных в маске покрытия пикселя, может не равняться доле пикселя, который фактически покрывается рассматриваемым фрагментом.
Отбор проб по площади
Качество фильтрации можно улучшить, используя маски с выборкой областей. В этом методе количество битов, установленных в маске покрытия для пикселя, должно быть пропорционально фактическому охвату области фрагмента. Это приведет к тому, что некоторые биты покрытия будут установлены для мультисэмплов, которые на самом деле не расположены внутри визуализированного примитива, и могут вызвать наложение и другие артефакты.
Образцы выкройки
Обычная сетка
Шаблон регулярной сетки, в котором местоположения множественных выборок образуют равномерно распределенную сетку по всему пикселю, легко реализовать и упрощает оценку атрибутов (т. Е. Установку масок субпикселей, цвета и глубины выборки). Этот метод требует больших вычислительных ресурсов из-за большого количества выборок. Оптимизация краев для краев, выровненных по экрану, оставляет желать лучшего, но качество изображения хорошее при большом количестве мультисэмплов.
Редкая регулярная сетка
Стохастические образцы образцов
Качественный
По сравнению с суперсэмплингом, сглаживание мультисэмплов может обеспечить аналогичное качество при более высокой производительности или лучшее качество при той же производительности. Дальнейшее улучшение результатов может быть достигнуто за счет использования субпиксельных масок с повернутой сеткой. Дополнительная полоса пропускания, необходимая для множественной выборки, будет достаточно низкой, если доступны Z и сжатие цвета.
Большинство современных графических процессоров поддерживают сэмплы 2 ×, 4 × и 8 × MSAA. Более высокие значения приводят к лучшему качеству, но работают медленнее.
Настройка и оптимизация Assassin’s Creed
Assassin’s Creed – консольный проект, это значит, что игра была разработана для консоли и затем портирована на ПК. А ешё это значит, что у игры куда меньше возможностей для оптимизации, чем у «коренных» ПК-игр. Но всё же кое-какие возможности по тонкой настройке имеются, например, можно установить 2-й уровень детализации, но отключить тени, что может значительно поднять FPS на старых системах. Это и многое другое будет описано ниже.
Продвинутые настройки игры можно найти в ini-файлах, которые располагаются в следующих папках:
Windows XP: \Documents and Settings\Имя Юзера\Application Data\Ubisoft\Assassin’s Creed
Windows Vista: \Users\Имя Юзера\AppData\Roaming\Ubisoft\Assassin’s Creed
Все настройки игры хранятся в двух файлах – Assassin.ini, который содержит настройки графики и геймплея, и DARE.ini, который содержит настройки звука. Эти файлы можно редактировать обычным Блокнотом, но сначала рекомендую сделать их резервную копию.
Ниже рассмотрим основные ini-переменные и влияние их на игру. Я не буду приводить здесь параметры, полностью аналогичные настройкам из меню игры (например, PostFX или VSync) и переменные, изменение которых не даёт никакого эффекта. Важно! После редактирования ini-файлов не трогайте настройки в меню игры, иначе вам придётся снова настраивать конфигурацию в ini.
DisplayWidth=1280
DisplayHeight=1024
Эти настройки, как вы уже догадались, определяют разрешение экрана. Вы можете поменять его и через меню в игре, но здесь можно поставить любое другое разрешение.
RefreshRate=75
Это настройка частоты обновления экрана, поставьте здесь максимально возможное для вашего монитора значение, чтобы глазам было комфортно.
ShadowDistance=4
Это более точная регулировка дистанции прорисовки теней, чем в меню игры. При выставлении через меню качества теней = 3, этот параметр равен 4, если 2, то расстояние прорисовки 2, и при качестве 1, это значение равно 0, т. е. теней нет. Здесь вы можете более точно управлять расстоянием прорисовки теней, независимо от их качества.
ShadowMapSize=1024
Эта переменная определяет разрешение и, следовательно, общее качество теней в игре. Чем выше величина, тем более качественными будут тени. В внутриигровых настройках вы можете установить только 4 значения (то есть, 1024, 768, 640 или 512). Но здесь вы можете попробовать более низкие значения, например, 256 или 128, чтобы улучшать FPS ценой качества. Но имейте в виду, что 1024 – максимальное разрешение карт теней.
DistanceLOD=0
Эта переменная определяет детализацию объектов на расстоянии. Более высокая величина соответствует меньшей детализации на расстоянии, что может улучшить FPS на открытых пространствах. Эта настройка меняется при изменении уровня детализации в меню игры. На УД 4 и 3 эта переменная = 0, на УД 2 или 1 это равно 2.
MaxNPCLODLevel=5
Эта установка регулирует уровень детализации всех и чем выше величина, тем более подробнее прорисованы персонажи, независимо от их расстояния до камеры. Эта настройка меняется при изменении уровня детализации в меню игры. На УД 4 эта величина = 5, УД 3 – NPCLOD = 3, УД 2 – NPCLOD = 2 и УД 1 – NPCLOD = 1. Здесь вы можете менять это значения независимо от уровня детализации в игре, но отметьте, что установка значения 0 может вызвать артефакты изображения.
SmallObjectsCullDistanceModifier=1
MediumObjectsCullDistanceModifier=1
Эти переменные управляют расстоянием, на котором объекты пропадают из поля зрения. Они меняются при изменении уровня детализации в меню игры, например на УД = 1 в игре, SmallObjectsCullDistanceModifier=5 и MediumObjectsCullDistanceModifier=3. Величина 1 для этих параметров должна обеспечить самое высокое качество.
Fullscreen=1
Значение 1 – запуск игры в полноэкранном режиме, 0 – в оконном.
Particle=1
Этот набор знаков включает или выключает эффекты системы частиц (дым, пыль, облака). 1 – вкл, 0 – выкл. Эта настройка меняется при изменении уровня детализации в меню игры: при УД 3 или 4 она включена, на более низких значениях отключена.
LODBlend=1
Эта настройка включает (1) или выключает (0) сглаживание переходов между текстурами разного уровня детализации. Отключение этой опции поднимет производительность, но снизит качество изображения.
Layers=1
Эта настройка включает (1) или выключает (0) дополнительные детали, такие как следы на дорогах. Влияния на скорость не оказывает, да и на визуальное качество тоже.
Anisotropic=1
Эта настройка включает (1) или выключает (0) анизотропную фильтрацию (AF). Выбрать качество фильтрации нельзя, значения выше 1 не работают.
AdvancedDynamicLighting=1
Вкл./выкл. динамическое освещение.
[Renderer DS3D Options]
DS3D_CACHE_SIZE=2097152
Это – величина кэша для хранения звука в байтах. Для устранения звуковых артефактов, особенно на встроенных звуковых картах, попробуйте величину 4194304 (4MB) или даже 8388608 (8MB). А также, если вы увеличиваете количество каналов с помощью NB_AUDIBLE_VOICES, рекомендую увеличивать также и кэш.
DISABLE_OPTIMISATION=FALSE
Если здесь стоит =TRUE, значит ваша звуковая карта не поддерживает современные аудио-функции, лучше оставить это как есть. Если здесь стоит =FALSE и при этом у вас в игре есть какие-либо звуковые артефакты, установите эту переменную =TRUE, возможно, это поможет.
[Sound Manager Options]
NB_AUDIBLE_VOICES=48
Эта настройка указывает число используемых игрой звуковых каналов. Старые звуковые карты могут осилить только 32 канала, тогда как более качественные карты могут поддерживать, по крайней мере, 64 канала (напр. Audigy 2) и даже 128 каналов (напр. серия X-Fi). Если вы наблюдаете звуковые артефакты, попробуйте уменьшить это значение, или увеличить, если уверены в силах своей звуковухи.
Маленький совет: чтобы выйти из Assassin’s Creed, нужно совершить довольно много кликов мышью, поэтому рекомендую выходить из игры по Alt-F4, в этом случае выход будет совершён мгновенно, а последняя контрольная точка не будет потеряна. Только не делайте это во время сохранения, иначе вы можете испортить файл сохранения.
Learn OpenGL. Урок 4.11 — Сглаживание
Сглаживание
В своих изысканиях, посвященных трехмерному рендеру вы наверняка сталкивались с появлением пикселизованных зазубрин по краям отрисовываемых моделей. Эти отметины неизбежно появляются из-за принципа преобразования вершинных данных в экранные фрагменты растеризатором где-то в глубине пайплайна OpenGL. К примеру, даже на такой простой фигуре как куб уже заметны эти артефакты:
Беглый взгляд, возможно, и не заметит ничего, но стоит посмотреть внимательней и на гранях куба проявятся означенные зазубрины. Попробуем увеличить изображение:
Эффект явной видимости попиксельной структуры изображения по краям объектов называется алиасингом. В индустрии компьютерной графики уже накоплено немало техник, называющихся техниками анти-алиасинга или сглаживания, которые как раз и борются с данным эффектом, позволяя обеспечить плавные переходы на границах объектов.
Так, например, одной из первых была техника суперсэмплинга (super sampling anti-aliasing, SSAA). Реализация выполняется в два прохода: сначала рендер идет во внеэкранный кадровый буфер с разрешением заметно больше экранного; затем изображение переносилось с уменьшением в экранный буфер кадра. Эта избыточность данных за счет разницы в разрешении использовалась для уменьшения эффекта алиасинга и работал метод прекрасно, но было одно «Но»: производительность. Вывод сцены в огромном разрешении отнимал порядочно сил у GPU и век славы этой технологии был недолог.
Но из пепла старой технологии родилась новая, более продвинутая: мультисэмплинг (multi sampling anti-aliasing, MSAA). Основывается она на идеях SSAA, но реализует их гораздо более эффективным методом. В данном уроке мы подробно рассмотрим подход MSAA, который доступен нативно в OpenGL.
Мультисэмплинг
Чтобы понять суть мультисэмплинга и как он работает, нам сперва придётся поглубже залезть в потроха OpenGL и взглянуть на работу её растеризатора.
Растеризатором называют комплекс алгоритмов и процедур, которые стоят между окончательно обработанными вершинными данными и фрагментным шейдером. Растеризатор получает на вход все вершины, относящиеся к примитиву и преобразует эти данные в набор фрагментов. Вершинные координаты, теоретически, могут быть абсолютно любыми, но не координаты фрагментов – они жестко ограничены разрешением вашего устройства вывода и размерами окна. И практически никогда координаты вершины примитива не будут накладываться на фрагменты один к одному: так или иначе растеризатору придется некоторым образом решать в каком фрагменте и по какой экранной координате окажется каждая из вершин.
На изображении показана сетка представляющая экранные пиксели. В центре каждого из них помещена точка выборки/сэмплинга, которая используется для определения того, накрывает ли треугольник данный пиксель. Красным отмечены точки выборки, покрытые треугольником – для них растеризатор сгенерирует соответствующий фрагмент. Несмотря на то, что грани треугольника местами перекрывают некоторые пиксели, они не перекрывают точку сэмплинга – здесь фрагмент не будет создан и фрагментный шейдер для данного пикселя выполняться не будет.
Думаю, вы уже догадались о причинах алиасинга. Рендер данного треугольника на экране будет выглядеть так:
Из-за конечности количества пикселей на экране некоторые, расположенные вдоль граней треугольника, будут закрашены, а некоторые – нет. В результате выходит, что рендерятся примитивы вовсе не с гладкими гранями, что и проявляется в виде тех самых зазубрин.
При использовании мультисэмплинга используется не одна точка для определения перекрытия пикселя треугольником, а несколько (отсюда и название). Вместо одной точки выборки в центре пикселя для определения перекрытия будут использованы 4 точки подвыборки, расположенные по некоторому шаблону. Следствием является то, что размер буфера цвета должен также увеличиться в четыре раза (по количеству используемых точек подвыборки).
Количество точек подвыборки может быть изменено в определенных пределах. Большее число точек – лучше качество сглаживания.
С этого момента все происходящее становится интереснее. Определив, что две точки подвыборки пикселя были покрыты треугольником, необходимо вывести итоговый цвет для этого пикселя. Первой догадкой было бы выполнить фрагментный шейдер для каждой перекрытой треугольником точки подвыборки и затем усреднить цвета всей точек подвыборки в пикселе. В этом случае пришлось бы несколько раз выполнить фрагментный шейдер с вершинными данными интерполированными к координатам каждой из перекрытых точек подвыборки (дважды в данном примере) и сохранить полученные цвета в этих точках. К счастью, на самом деле процесс мультисэмплинга работает не так – иначе нам пришлось бы выполнять немалое число дополнительных вызовов фрагментного шейдера, что сильно ударило бы по производительности.
По факту при использовании MSAA фрагментный шейдер выполняется ровно один раз вне зависимости от числа закрытых примитивом точек подвыборки. Фрагментный шейдер выполняется с вершинными данными интерполированными к центру пикселя, а полученный при его выполнении цвет сохраняется в каждой из перерытых примитивом точек подвыборки. Когда все точки подвыборки буфера кадра заполнены цветами отрисованных нами примитивов, тогда происходит попиксельное усреднение цветов к одному значению на пиксель. В данном примере только две точки подвыборки были перекрыты и, соответственно, заполнены цветом треугольника. Оставшиеся две были заполнены прозрачным цветом фона. При смешивании цветов этих подвыборок получился светло-синий цвет.
Буфер кадра в результате содержит изображение примитивов с гораздо более сглаженными краями. Посмотрите, как выглядит определение покрытия подвыборок на уже знакомом треугольнике:
Видно, что каждый пиксель содержит по четыре точки подвыборки (не важные для примера пиксели оставлены незаполненными), при этом синим отмечены покрытые треугольником точки подвыборки, а серым – непокрытые. Внутри периметра треугольника для всех пикселей будет единожды вызван фрагментный шейдер, результат выполнения которого будет сохранен во всех четырех подвыборках. На гранях же не все подвыборки будут покрыты, так что результат выполнения фрагментного шейдера сохранен будет лишь в части из них. В зависимости от количества покрытых треугольником точек подвыборки итоговый цвет пикселя определяется на основе цвета самого треугольника и других, сохраненных в точках подвыборки, цветов.
Проще говоря, чем больше подвыборок покрыто треугольником, тем в большей степени цвет пикселя будет соответствовать цвету треугольника. Если сейчас заполнить цвета пикселей также, как в примере с треугольником без использования мультисэмплинга, то выйдет следующая картинка:
Как видно, чем меньше подвыборок пикселя принадлежат треугольнику, тем меньше его цвет соответствует цвету треугольника. Четкие границы треугольника теперь окружены пикселями слегка более светлого оттенка, что создает эффект сглаживания, если наблюдать с расстояния.
Но не только значения цвета подвержены работе алгоритма мультисэмплинга: буфер глубины и трафарета также начинают использовать множественные подвыборки для пикселя. Значение глубины вершины интерполируется для каждой из точек подвыборки перед выполнением теста глубины. Значения трафарета хранятся не для всего пикселя, а для каждой из точек подвыборки. Для нас это означает и рост объема памяти, занимаемой этими буферами, в соответствии с количеством используемых подвыборок.
Здесь мы рассмотрели самые основы того, как функционирует мультисэмплинг. Истинная внутренняя логика работы растеризатора будет посложнее, чем приведенный здесь обзор. Однако, для целей общего понимания принципа и хода работы мультисэмплинга этого вполне достаточно.
Мультисемплинг в OpenGL
Для использования мультисэмплинга в OpenGL необходимо использовать буфер цвета, способный хранить больше, чем одно значение цвета на пиксель (ведь MSAA подразумевает хранение значения цвета в точках подвыборки). Таким образом, нам требуется какой-то особенный тип буфера, который сможет хранить заданное количество подвыборок – мультисэмпл буфер.
Большинство оконных систем могут предоставить нам мультисэмпл буфер вместо стандартного буфера цвета. GLFW также обладает данной функциональностью, все что потребуется – установить специальный флаг, сигнализирующий о нашем желании использовать буфер с N точками подвыборки, вместо стандартного:
Теперь вызов glfwCreateWindow создаст окно вывода с буфером цвета, хранящим по четыре подвыборки на каждую экранную координату. Также GLFW автоматически создаст буферы глубины и трафарета, использующие те же четыре точки подвыборки на пиксель. И размер каждого из упомянутых буферов вырастет в четыре раза.
После создания мультисэмпл буферов силами GLWL остается включить режим мультисэмплинга уже в OpenGL:
В большинстве драйверов OpenGL мультисэмплинг активен по умолчанию, поэтому данный вызов будет излишним, но явное включение нужных вам функций – хороший тон, а также это позволит активировать режим вне зависимости от умолчаний конкретной реализации.
Собственно, после заказа мультисэмпл буфера и включения режима вся наша работа закончена, поскольку все остальное ложится на механизмы растеризатора OpenGL и происходит без нашего участия. Если сейчас попробовать вывести зеленый куб, знакомый по самому началу урока, то мы увидим, что его грани теперь гораздо более гладкие:
Действительно, края этого кубика выглядят гораздо более привлекательно. И тот же эффект скажется на любом объекте в вашей сцене.
Исходник примера находится здесь.
Внеэкранный мультисемплинг
Создание основного кадрового буфера с включенным MSAA простая задача, благодаря GLFW. Если же мы хотим создать собственный буфер, например, для внеэкранного рендера, то придется взять этот процесс в свои руки.
Есть два основных метода создания буферов с мультисэмплингом для дальнейшего присоединения к кадровому буферу, сходных с уже разобранными примерами из соответствующего урока: текстурные прикрепления и прикрепления типа рендербуфера.
Текстурное прикрепление с мультисемплингом
Для создания текстуры, поддерживающей множественные подвыборки, используется тип текстурной цели GL_TEXTURE_2D_MULTISAPLE и функция glTexImage2DMultisample вместо привычной glTexImage2D:
Второй аргумент указывает число подвыборок в создаваемой текстуре. Если последний аргумент установлен в GL_TRUE, то текстура будет использовать одинаковое число и положение точек подвыборки для каждого текселя.
Для присоединения такой текстуры к объекту кадрового буфера используется все тот же вызов glFramebufferTexture2D, но, в этот раз, с указанным типом текстуры GL_TEXTURE_2D_MULTISAMPLE:
В итоге текущий кадровый буфер будет обеспечен буфером цвета на основе текстуры с поддержкой мультисэмплинга.
Рендербуфер с мультисемплингом
Создание рендербуфера с множеством точек подвыборки не сложнее создание такой текстуры. Более того, оно даже проще: все что нужно сделать, так это сменить вызов glRenderbufferStorage на glRenderbufferStorageMultisample при подготовке памяти под привязанный в данный момент объект рендербуфера:
Из нового здесь только один дополнительный параметр, идущий после типа цели привязки рендербуфера, который указывает число точек подвыборки. Здесь мы указали четыре таких точки.
Рендер в кадровый буфер с мультисемплингом
Рендер в мультисэмпл кадровый буфер идет автоматически, без требуемых действий с нашей стороны. Каждый раз, когда мы рендерим в привязанный кадровый буфер, растеризатор сам проводит необходимые операции. А мы получаем на выходе буфер цвета (глубины, трафарета) с множеством точек подвыборки. Поскольку кадровый буфер с множеством точек подвыборки все же несколько отличается от обычного, не получится напрямую использовать отдельные его буферы для различный операций, типа текстурной выборки в шейдере.
Изображение с поддержкой мультисэмплинга содержит больше информации, чем обычное, потому необходимо разрешить (resolve) это изображение, или, иными словами, преобразовать его разрешение к меньшему. Эта операция по обыкновению проводится с помощью вызова glBlitFramebuffer, что позволяет скопировать область одного кадрового буфера в другой с попутным разрешением присутствующих буферов с множеством точек подвыборки.
Данная функция осуществляет перенос области-источника, заданной четырьмя координатами в экранном пространстве, в область-приемник, также заданную четырьмя экранными координатами. Напомню урок по кадровым буферам: если мы привязываем объект буфера кадра к цели GL_FRAMEBUFFER, то неявно привязка осуществляется и к цели чтения из буфера кадра и к цели записи в буфер кадра. Для привязки к этим целям по отдельности использутся специальные идентификаторы целей: GL_READ_FRAMEBUFFER и GL_DRAW_FRAMEBUFFER соответственно.
Во время своей работы функция glBlitFramebuffer использует эти точки привязки для определения, какой из буферов кадра является источником изображения, а какой – приемником. В итоге, мы могли бы просто перенести изображение из мультисэмпл буфера кадра в стандартный используя блиттинг:
Собрав и запустив приложение мы бы получили изображение идентичное предыдущему примеру, не задействовавшему буфер кадра: кислотно-зеленый куб, отрисованный с использованием MSAA, в чем можно убедиться, рассмотрев его грани – они все так же гладки:
Исходники примера находятся здесь.
Но что делать в случае, если изображение из буфера кадра с множеством точек подвыборки мы бы хотели использовать в качестве источника данных для постпроцессинга? Напрямую использовать мультисэмпл текстуры в шейдере мы не можем. Но можно попробовать перенести изображение из мультисэмпл буфера кадра с помощью блиттинга в другой, с обычными, не мультисэмпл, буферами. А далее можно использовать обычное изображение как ресурс для постобработки, по сути получая все преимущества MSAA и добавляя сверху этого постобработку. Да, для всего этого процесса придется заводить отдельный буфер кадра, служащий чисто как вспомогательный объект для разрешения MSAA текстур в обычные, которые можно использовать в шейдере. В виде псевдокода процесс выглядит так:
Если мы добавим этот код к примерам постобработки из урока по буферу кадра, то сможем применить все те эффекты к изображению сцены без зазубренных краев. Например, с эффектом размытия получится что-то подобное:
Поскольку для постпроцессинга используется стандартная текстура с одной точкой подвыборки, то некоторые методы обработки (поиск границ, например) могут снова внести в сцену заметные резкие края и зазубрины. Чтобы обойти этот артефакт придётся либо размывать результат, либо реализовать свой алгоритм сглаживания.
Как видно, для сочетания MSAA и техник внеэкранного рендера приходится учесть некоторые детали. Но все дополнительные усилия окупаются гораздо более высоким качеством результирующего изображения. Однако, помните, что активация мультисэмплинга все же может значительно затронуть итоговую производительность, особенно при установленном большом количестве точек подвыборки.
Собственный метод сглаживания
На самом деле в шейдеры можно передать мультисэмпл текстуры напрямую, без блиттинга в вспомогательную обычную. В таком случае возможности GLSL предоставляют доступ к отдельным точкам подвыборки в текстуре, что может использоваться в создании собственных алгоритмов сглаживания (что нередко в крупных графических приложениях).
Для начала потребуется создание специального сэмплера типа sampler2DMS, вместо привычного sampler2D:
А для получения значения цвета в точке подвыборки используется следующая функция:
Здесь видно дополнительный аргумент – номер точки подвыборки (отсчет с нуля), к которой происходит обращение.
Подробности создания специальных алгоритмов сглаживания здесь рассматривать мы не будем – это не более чем точка отсчета для ваших собственных исследований по этой теме.