Як я можу реалізувати протизшивання у OpenGL?


28

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

Як слід діяти?


Під "антизбудженням, наданим самим GL", ви посилаєтесь на старі погано названі підказки щодо якості ліній та багатокутників, які позначені як "антиаліасинг", чи ви маєте на увазі використання звичайних MSAA через візуалізацію GLX / WGL?
Ларс Віклунд

Відповіді:


28

У OpenGL є кілька альтернатив рідній MSAA. Що стосується ефектів після обробки, найкраще в них те, що зазвичай можна просто кинути в шейдер до остаточного, необробленого зображення, а все інше. Ось три методи, на які варто звернути увагу:

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

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

  • Морфологічне згладжування (Iryoku) - удосконалено до SMAA - субпіксельної Мофологічної АА. Він досить складний за 4 проходи, але досягає найкращих результатів, які я бачив. Це створює градієнти по краях настільки ж поступово, як круті (!) Від 1 100 до 1/200 пікселів. Відбір проб може бути на основі луми, кольору або глибини. Текстури залишаються дуже чіткими і чистими. (наприклад, на базі DX10 та HLSL, потрібен би час, щоб точно перенести його на GLSL)

Ці методи не є зразковими або мультипробними, тому рядки, що мають товщину менше 1 пікселя, з’являться із пробілами, а не будуть правильно налаштовані. Це є недоліком використання підходу без MSAA. Оскільки ви працюєте лише з растровим зображенням з повною роздільною здатністю, ви не можете створити додаткову інформацію з цих порожніх прогалин.

Зауважте, що всі ці методи залежать від вибірки суміжних значень луми (яскравості) або кольоровості (кольору). Розрахунок луми та необов'язкової корекції гамма вимагає додаткових інструкцій по шейдеру AA, хоча це досить просто. Ви можете скасувати це, обчисливши луму в попередньому шейдері, що забезпечує неретушоване зображення, зберігаючи луму в альфа-каналі. Тоді в шейдері AA ви просто пробите альфа.


7

Існує маса способів зробити антиалізинг. Перша полягає у використанні мультипробного антиаліасингу (MSAA), де ваш задній буфер фактично зберігає кілька зразків пікселів, і коли ви рендеруєте трикутники, лінії тощо, система автоматично заповнює правильний набір зразків у кожному пікселі. Потім в кінці візуалізації зображення "вирішується" шляхом усереднення всіх зразків пікселів, щоб отримати один зразок на піксель.

Інший спосіб полягає в застосуванні післяобробки антиаліазу, коли ви відтворюєте сцену як нормальну, а потім робите деяке цільове розмивання на кінцевому результаті, щоб приховати стовбурні краї. Для цього існують найрізноманітніші методи, але одна з найкращих / найпопулярніших на даний момент називається FXAA (Fast ApproXimate Anti-Aliasing).

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

Ви можете знайти конкретну інформацію про впровадження MSAA або FXAA в Інтернеті - просто google будь-який з цих умов.


2

Ви готові кодувати свій власний шейдер GLSL? Якщо так, перевірте цей підручник.


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