Как мне реализовать сглаживание в OpenGL?


28

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

Как мне поступить?


Под «сглаживанием, предоставленным самой GL», вы ссылаетесь на старые плохо названные линейные и полигональные подсказки качества, которые помечены как «сглаживание», или вы имеете в виду использование обычного MSAA через визуальные эффекты GLX / WGL?
Ларс Виклунд

Ответы:


28

Есть несколько альтернатив нативному MSAA в OpenGL. С эффектами постобработки, лучшее в них то, что вы обычно можете просто добавить шейдер к окончательному необработанному изображению, а он сделает все остальное. Вот три метода, которые стоит посмотреть:

  • Быстрое приблизительное сглаживание (Geeks3D) - хорошо в большинстве случаев. Довольно легко применить и понять. Недостаток резкий, высококонтрастный шум в текстурах немного размыт. Тонкие края, такие как крутые 1/4 пикселя, выглядят абсолютно точно, как традиционные MSAA. Любой менее крутой, чем это, он теряет немного точности.

  • Нормально отфильтрованное сглаживание (GameDev ) - еще не проверил это точно, но это проще всего понять. В лучших случаях это напоминает 16x MSAA, а в худших - 2x MSAA. Он генерирует временную карту нормалей для представления ребер и относительных углов. Вы можете выбрать карту нормалей либо с разницей в яркости, либо с разницей в цвете.

  • Морфологическое сглаживание (Iryoku) - улучшено до SMAA - субпиксельный Mophological AA. Это довольно сложно в 4 прохода, но достигает лучших результатов, которые я видел. Он создает градиенты по краям с шагом от 1/100 до 1/200 пикселей (!). Выборка может быть основана на яркости, цвете или глубине. Текстуры остаются очень четкими и чистыми. (пример основан на DX10 и HLSL, для точного переноса его на GLSL потребуется некоторое время)

Эти методы не являются суперсэмпламированными или мультисэмплированными, поэтому линии, имеющие толщину менее 1 пикселя, будут отображаться с пробелами и не будут корректно сглаживаться. Это недостаток использования подхода не-MSAA. Поскольку вы работаете только с растровым изображением в полном разрешении, вы не можете создавать дополнительную информацию из этих пустых промежутков.

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


7

Есть много способов сделать сглаживание. Один из них заключается в использовании сглаживания мультисэмплов (MSAA), когда в вашем заднем буфере хранятся несколько субпиксельных сэмплов, а при рендеринге треугольников, линий и т. Д. Система автоматически заполняет правильный набор сэмплов в каждом пикселе. Затем в конце рендеринга изображение «разрешается» путем усреднения по всем выборкам субпикселя, чтобы получить одну выборку на пиксель.

Другой способ - использовать сглаживание после обработки, когда вы визуализируете сцену как обычно, а затем выполняете некоторое целевое размывание конечного результата, чтобы скрыть связанные края. Для этого существует множество методов, но один из лучших / самых популярных на данный момент называется FXAA (быстрый подход к сглаживанию).

MSAA обычно дает более привлекательные результаты, чем постобработка AA, но может быть медленнее, поскольку для каждой операции рендеринга требуется примерно удвоенная пропускная способность памяти. MSAA также может потребовать больше видеопамяти, чем постобработка AA, в зависимости от деталей настройки.

Вы можете найти конкретную информацию о реализации MSAA или FXAA в Интернете - просто воспользуйтесь одним из этих терминов.


2

Вы готовы написать свой собственный шейдер GLSL? Если это так, проверьте этот учебник.


ну, я хотел бы сделать это с помощью шейдеров, потому что я использую шейдеры и для других эффектов. Не могли бы вы предоставить некоторые другие ссылки для шейдеров
noddy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.