Обмеження 3D відображення

Вступ

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

Межі розміру текстури

Більш старі ПК та ноутбуки можуть не підтримувати текстури більші ніж 8192×8192. Ви можете перевірити свій графічний процесор на GPUinfo.org.

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

Розшарування кольорів

Коли Godot використовує GLES3 чи Vulkan для відображення, то всередині він використовує HDR. Але, при відображенні на фізичному екрані, отримане зображення буде переведене в нижчий динамічний діяпазон. Через це, кольори можуть розділитись на шари, особливо це помітно при використанні не текстурованих матеріялів. Таке також може трапитись у 2D проєкті, коли в ньому використовуються текстури із гладкими градієнтами.

Побороти розшарування можна двома способами:

  • Увімкнути Use Debanding в налаштуваннях проєкту. Цим ви застосуєте шейдер розвишаровування до усього екрану. Між іншим, цей спосіб майже не навантажує систему. Повноекранне розвишаровування працює лише тоді, коли використовується GLES3 чи Vulkan. А ще воно потребує увімкненого HDR в налаштуваннях проєкту (воно і так увімкнене за замовчуванням).

  • Інакше, додайте шуму до ваших текстур. Найбільше користі це приносить в 2D, як-от для віньєтування. Натомість в 3D ви можете додати до ваших матеріялів саморобний шейдер розвишаровування. Цей підхід працює навіть якщо ваш проєкт відображається в LDR, а значить він працюватиме і при візуалізаторі GLES2.

Дивись також

Почитайте Banding in Games: A Noisy Rant щоб дізнатись більше про деталі розшарування а також про те, як з ним боротися.

Точність буфера глибини

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

Щоби буфер точніше працював з областю, що відображається, варто збільшити параметр вузла камери Near (ближня межа). Але будьте обережні: якщо задати надто високе значення, гравець може почати дивитись крізь ближні об'єкти. Також варто зменшити параметр камери Far (дальня межа) наскільки це можливо. Проте пам'ятайте, що він не так сильно впливає на точність як „Near“.

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

Залежно від сцени та умов, у вас може бути можливість просто розсунути конфліктні об'єкти один від одного без суттєвого впливу на вигляд сцени.

Перебір по прозорості

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

Деякі візуалізатори мають змогу побороти це використовуючи порядко-незалежну прозорість, але вона сильно навантажує відеоприскорювач. На даний момент, Godot не має таких можливостей. Але у вас є декілька шляхів уникнення проблеми:

  • Робити матеріяли прозорими лише за необхідності. Якщо лише маленька чатинка об'єкта має бути прозорою, розбийте його матеріял надвоє. Тоді у вас повиситься продуктивність програми а непрозора частина зможе відкидати тінь.

  • Якщо ви хочете, щоб об'єкт розчинявся при віддалені, використайте один з режимів розчинення на відстані матеріялу SpatialMaterial: Pixel Dither чи Object Dither замість PixelAlpha. Тоді об'єкт буде непрозорим і зможе відкидати тінь.

Багатовибіркове згладжування

Багатовибіркове зглажування (MSAA) бере декілька наборів покривають пікселів на ребрах полігонів коли об'єкти відображаються. Воно не збільшує кількости кольорових пікселів що використані у сцені. Що це значить на практиці:

  • Ребра геометричних фігур будуть гладенькими (такими ж, якими вони були б при перевибірковому згладжуванні).

  • Прозорі матеріяли, що використовують alpha testing (однобітну прозорість) не будуть згладжуватись.

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

Залежно від величини продуктивності, якою ви можете пожертвувати, ви можете обійти вищезгадані обмеження таким чином:

  • Щоб зробити зубчатість відблиску менш помітною, відкрийте налаштування проєкту та увімкніть Rendering > Quality > Screen Space Filters > Screen Space Roughness Limiter. Цей фільтр має середнє навантаження на систему. Вмикайте його лише коли це справді необхідно.

  • Увімкніть FXAA на додачу до (чи замість) MSAA. Так як FXAA — згладжує зображення на екрані, то він може згладити будь-що. Його недолік — вся сцена стане розмитою, особливо при роздільній здатності менше 1440p.

  • Відобразіть сцену при вищій роз. здатності, а потім відобразіть її на оглядовій текстурі (ViewportTexture) розміром з екран вікна. Переконайтесь, що у неї увімкнена опція Filter . Такий підхід називають перевибіркою (supersampling) й він дуже повільний. Зазвичай, він використовується для статичного відображення зображень.