Які загальні методи оптимізації візуалізації для передачі геометрії у відкладеному відтінку відтінку? [зачинено]


16

Я розробляв ігровий движок, використовуючи OpenGL 3 і C ++ (і glfw для управління вікнами). Я до сих пір просунувся, отримав більшість справ, крім звукових сутностей та оптимізацій. Двигун використовує відкладене затінення, тому що відкладене затінення є самим стомлюючим процесом для середнього GPU, я хочу максимально оптимізувати процес візуалізації.

Поточна система складається з сцени, що містить Відображателя та поточний Світ і Світ містить об'єкти та освітлювальні об'єкти як окремі std::vectors.

Таким чином, кожен раз, коли Сцена ->render()дзвонить, і він викликає Рендерера, передаючи світ як параметр і отримує ітераторів сутності від світу, звертає їх до ФБО, а потім проходить через освітлювальні об'єкти для другого проходу. І я думаю, цього недостатньо.

Мій поточний алгоритм повторює все, навіть якщо сутність не знаходиться в екрані. Я думаю про спосіб оптимізації поточного алгоритму візуалізації, щоб він викликав лише функції API лише для видимих ​​об'єктів, тож які загальні методи оптимізації такого рендерінга?

Відповіді:


41

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

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

Відкладене відображення намагається вирішити проблему, коли кількість вогнів збільшується, що при подачі вперед може змусити кількість проходів вибухнути.

Ці методи безпосередньо не оптимізують відкладену затінювальну частину, але згідно з вашим описом, відкладена затіняюча частина НЕ є вашою проблемою. Ваша проблема, однак, полягає в тому, що ви подаєте всю сцену на надання конвеєра. Тож ваш двигун повинен обробляти (наприклад, всі 100 мільйонів вершин) у вашій сцені лише для того, щоб мати змогу подати результат у g-буфер, тоді як більшість тез у 100 мільйонів вершин можна тривільно видалити, а не подати до попередньо обробляють вершину та фрагменти.

У випадку прямого рендерінга вершина N буде оброблена стадією вершини як загальна сума, vertex count*lights countа стадія фрагмента як загальна кількість fragments count*number Lights, відкладене затінення ефективно зводить це лише vertex countдо стадії вершини та fragments countдля підрахунку фрагмента, перш ніж вирішити значення фактичне затінення. Але все-таки N може бути занадто багато для обробки, особливо коли більшість з них може бути тривіально знищена.

Це робить вимкнення більш ефективним у випадку передачі вперед / декількох проходів. Але майте на увазі, що більшість двигунів використовуватиме подвійний підхід рендерінгу, оскільки відкладене затінення одне не може вирішити прозорі об'єкти, це робить використання цих оптимізацій необхідним, я не знаю жодного комерційного двигуна, який не виконує їх усіх.

Куріння плоду

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

введіть тут опис зображення

Навіть з обмежуючими обсягами вам не потрібно перевіряти кожен з них, або ви можете побудувати обмежувальну ієрархію томів, щоб зробити попереднє відсікання, використовуючи це, що сильно залежить від складності сцени.

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

Ієрархія обмеження обсягу

Відкидання спини обличчя

Це обов’язково, чому малювати обличчя, які все одно не будуть видні? API рендерингу надають інтерфейс для вмикання / вимкнення зворотного відключення обличчя. Якщо у вас немає вагомих причин, чому б не ввімкнути його, як і деякі програми CAD, які потребують малювання задньої поверхні за певних обставин, це обов'язково.

Виключення прикусу

За допомогою Z-буфера ви можете вирішити визначення видимості. Але проблема полягає в тому, що Z-буфер не завжди чудовий з точки зору продуктивності, оскільки Z-буфер може бути вирішений лише на більш пізніх стадіях конвеєра, об'єкти, що закриваються, повинні бути растеризовані і можуть бути записані в Z-буфер і Кольоровий буфер перед тим, як не вдатися до тесту Z.

Відключення оклюзії вирішує це, роблячи кілька ранніх тестів на вилучення оклюзійних предметів, які перебувають у плоді візуалізації. Одне практичне здійснення відключення оклюзії - це використання точкових запитів і перевірка того, чи певні об'єкти видно з певної точки зору. Це також можна використовувати для зменшення світла, яке не сприяє остаточному зображенню. Це особливо корисно у відкладеному рендері двигуна.

введіть тут опис зображення

Чудовий приклад такої техніки в реальному світі - в GTA5, де хмарочоси стратично розміщуються в центрі міста, є не лише прикрасою, але вони також працюють як окклюдери, ефективно забиваючи решту частини міста і не даючи їй бути растровані.

ЛОД

Рівень деталізації

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

введіть тут опис зображення

Що робити, якщо все це не спрацювало?

Ну, це гарне запитання.

Перше, що вам потрібно зробити - це профілювати свою програму за допомогою графічного профілера та визначити, де знаходиться вузьке місце. Майте на увазі, що вузьке місце може змінюватися в міру зміни вмісту, що надається. Вузькі пляшки також можуть бути частиною коду, що працює на процесорі, тому вам також потрібно вимірювати це.

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

Деякі поширені прийоми оптимізації GPU:

  • Уникайте розгалуження в шейдерах.
  • Спробуйте різні вершинні структури, наприклад {VNT}переплетені в одному масиві або {V},{N},{T}в різних масивах.
  • Намалюйте сцену спереду назад.
  • Вимкніть Z-буфер в деяких точках, наприклад, якщо для зображення не потрібно тестування Z.
  • Використовуйте стислі текстури.

Деякі поширені прийоми оптимізації процесора:

  • Використовуйте вбудовані функції для невеликих функцій.
  • Використовуйте SIMD (Єдина інструкція з декількома даними), коли це можливо.
  • Уникайте кеш-стрибок недружньої пам'яті.
  • Використовуйте VBO з "правильним" обсягом даних. (залежно від обладнання), але зазвичай менше дзвінків на дзвінки краще.

Але що робити, якщо моє вузьке місце було в відкладеному затіненні?

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

  • Візуалізуйте вогні, які фактично впливають на остаточне зображення. Іншими словами, зменшіть світло, який не сприяє. Це можна ефективно реалізувати, використовуючи відмінювання оклюзії, про яке я згадував раніше.
  • Чи потрібні цьому світлу окуляри чи якісь інші компоненти? Можливо ні.
  • Це світло кидає тінь? Деякі світильники не повинні кидати тіні.
  • Чи можна заздалегідь обчислити цей легкий внесок? Якщо він не рухається, можливо, деякі аспекти можуть бути попередньо обчислені.

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

@MickLH На жаль, ти, мабуть, ти не читав питання, його проблема полягала в тому, що він щоразу повторюється на всій сцені, і він не згадував жодного вузького місця щодо відкладеного затінення. Спочатку я згадав, що відкладене затінення вирішує проблему вибуху пасом, коли є багато світла / матеріалів. Але я потім додав, що це необхідні оптимізації для будь-якого двигуна незалежно від техніки затінення вперед чи затримано. Зважаючи на те, що саме з цим питанням мігрує техніка, я категорично не погоджуюся, я не можу вирішити цілі моменти тут (далі)
concept3d

Насправді нерозумно побудувати відкладений двигун без фрустування, наприклад, таким чином двигун буде обробляти наприклад (100 мільйонів вершин) просто для того, щоб мати можливість подати результат у g-буфер. Різне затінення вирішує іншу проблему, яка не була його проблемою, його проблема полягала в поданні всієї геометрії на трубопровід.
concept3d

хоча я погоджуюсь із тим, що деяка оптимізація повинна відбуватися при розрахунках освітлення, і якщо обчислення світла не було домінуючим, то відкладене - це неправильний шлях. але знову це не було його проблемою.
concept3d

Я відступлю свою позицію, якщо ви дасте зрозуміти, що ці оптимізації насправді є найменш ефективними для відкладеного рендерінгу, оскільки, як ви думаєте, ви не показали йому / її + googlers, що проблема продуктивності не має нічого спільного з відкладеним затіненням.
MickLH

6

Ваша проблема не пов'язана з відкладеним затіненням , вам потрібно реалізувати основні основні елементи візуалізації, перш ніж спробувати прискорити якусь конкретну частину.

Закінчивши з тим, що пояснив concept3d, якщо ви дійсно виявите, що вам потрібно оптимізувати самий відкладений шейдер (на відміну від усього пропуску на растрізацію), ви можете реалізувати відкладене затінення на основі плитки.

Якщо ви не обмежені кількістю динамічних вогнів, вам слід розглянути, чому ви взагалі використовуєте відкладене затінення, але якщо ви є, то вам захочеться спробувати оптимізацію, яка зробила можливим Battlefield 3 можливим. (Вони натякають на це у слайді 10 свого публічного PDF: http://dice.se/wp-content/uploads/GDC11_DX11inBF3_Public.pdf )

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