Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Затінення зі змінною швидкістю

Що таке затінення зі змінною швидкістю?

У сучасних механізмах 3D-рендерінгу шейдери набагато складніші, ніж раніше. Поява фізичного рендерингу, глобального освітлення в реальному часі та ефектів екранного простору збільшила кількість піксельних затінень, які необхідно виконати для візуалізації кожного кадру. Крім того, роздільна здатність екрану також значно зросла, тепер 1440p і 4K є поширеними цільовими роздільними здатностями. Як результат, загальна вартість затінення під час візуалізації сцени зазвичай становить значну кількість часу, витраченого на рендеринг кожного кадру.

Затінення зі змінною швидкістю (VRS) — це метод зменшення вартості затінення шляхом зменшення роздільної здатності затінення на піксель (також називається фрагментним затіненням), зберігаючи при цьому вихідну роздільну здатність для відтворення геометрії. Це означає, що ребра геометрії залишаються такими ж гострими, як і без VRS. VRS можна поєднувати з будь-якою технікою 3D згладжування (MSAA, FXAA, TAA, SSAA).

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

Ось сцена, відтворена з вимкненим, а потім увімкненим затіненням за допомогою карти щільності, посилання на яку наведено внизу цієї сторінки:

Затінення зі змінною швидкістю вимкнено в текстурованій сцені

Затінення зі змінною швидкістю вимкнено в текстурованій сцені

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

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

При використанні в сценах із низькочастотними деталями (таких як сцени зі стилізованою/низькополігональною естетикою) можна досягти аналогічного приросту продуктивності, але з меншим зниженням якості зображення:

Затінення зі змінною швидкістю вимкнено в сцені без текстур

Затінення зі змінною швидкістю вимкнено в сцені без текстур

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

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

Апаратна підтримка

Затінення зі змінною швидкістю підтримується лише на певних графічних процесорах:

Настільний комп’ютер:

  • NVIDIA Turing і новіші (включаючи серію GTX 1600)

  • AMD RDNA2 і новіші (інтегровані та виділені графічні процесори – включаючи Steam Deck)

  • Intel Arc Alchemist і новіші (лише виділені графічні процесори)

    • Інтегрована графіка Intel не підтримує затінення зі змінною швидкістю.

Мобільні SoC:

  • Snapdragon 888 і новіше

  • MediaTek Dimensity 9000 і новіші

  • ARM Mali-G615 і новіше

Станом на січень 2023 року графічні процесори Apple і Raspberry Pi не підтримують затінення зі змінною швидкістю.

Використання затінення зі змінною швидкістю в Godot

Примітка

Обидва рендерери Forward+ і Mobile підтримують затінення зі змінною швидкістю. VRS можна використовувати як у режимах відображення млинця (не XR), так і в режимі відображення XR.

Рендерер сумісності не підтримує затінення зі змінною швидкістю. Для XR ви можете використовувати foveation level як альтернативу.

У розширених налаштуваннях проекту в розділі Відтворення > VRS пропонуються налаштування для керування затіненням зі змінною швидкістю в кореневому вікні перегляду:

  • Режим: Керує режимом затінення зі змінною швидкістю. Вимкнено вимикає затінення зі змінною швидкістю. Текстура використовує створену вручну текстуру для встановлення щільності затінення (див. властивість нижче). XR автоматично генерує текстуру, придатну для візуалізації у віртуальній/доповненій реальності.

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

Для користувальницьких вікон перегляду режим VRS і текстуру потрібно встановити вручну для вузла class_Viewport.

Примітка

На непідтримуваному апаратному забезпеченні немає візуальної різниці, коли ввімкнено затінення зі змінною швидкістю. Ви можете перевірити, чи апаратне забезпечення підтримує затінення зі змінною швидкістю, запустивши редактор або проект із аргументом --verbose command line argument.

Створення карти щільності VRS

Якщо ви використовуєте режим Texture VRS, ви потрібно встановити текстуру, яка буде використовуватися як карта щільності. Інакше ефекту не буде видно.

Ви можете створити власну карту щільності VRS вручну за допомогою редактора зображень або створити її за допомогою іншого методу (наприклад, на ЦП за допомогою класу Image або на GPU за допомогою шейдера). Однак уникайте наслідків для продуктивності під час динамічного створення образу VRS. Якщо ви обираєте динамічну генерацію, переконайтеся, що процес генерації зображень VRS достатньо швидкий, щоб не переважити підвищення продуктивності від VRS.

Текстура повинна відповідати таким правилам:

  • Текстура має використовувати формат стиснення без втрат, щоб кольори можна було точно підібрати.

  • Наступні щільності VRS зіставляються з різними кольорами, причому яскравіші кольори представляють нижчий рівень точності затінення:

Щільність

Колір

Коментар

1×1 (найвища деталізація)

rgb(0, 0, 0) - #000000

1×2

rgb(0, 85, 0) - #005500

2×1

rgb(85, 0, 0) - #550000

2×2

rgb(85, 85, 0) - #555500

2×4

rgb(85, 170, 0) - #55aa00

4×2

rgb(170, 85, 0) - #aa5500

4×4

rgb(170, 170, 0) - #aaaa00

4×8

rgb(170, 255, 0) - #aaff00

Не підтримується на більшості обладнання.

8×4

rgb(255, 170, 0) - #ffaa00

Не підтримується на більшості обладнання.

8×8 (найменша деталізація)

rgb(255, 255, 0) - #ffff00

Не підтримується на більшості обладнання.

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

Приклад текстури карти щільності VRS, що імітує фовеативне рендеринг

Приклад текстури карти щільності VRS, що імітує фовеативне рендеринг

Немає вимог до розміру чи співвідношення сторін для текстури щільності VRS. Однак використання карти щільності VRS, яка є більшою за роздільну здатність вікна перегляду, поділену на розмір плитки графічного процесора, не принесе жодних переваг. Розмір плитки – це те, що визначає найменшу область пікселів, де щільність затінення можна змінити окремо від інших плиток. На більшості графічних процесорів цей розмір плитки становить 8×8 пікселів. Ви можете переглянути розмір плитки, запустивши Godot з аргументом командного рядка --verbose, як це надруковано в інформації про налагодження VRS.

Тому рекомендується дотримуватися відносно низької роздільної здатності, наприклад 256×256 (квадрат) або 480×270 (16:9). Залежно від ваших випадків використання, квадратна текстура може бути більш підходящою порівняно з текстурою, яка відповідає найпоширенішому формату вікна перегляду у вашому проекті (наприклад, 16:9).

Порада

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

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

Порівняння продуктивності

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

Результати були отримані на GeForce RTX 4090 з драйвером NVIDIA 525.60.11.

роздільна здатність

VRS вимкнено

VRS увімкнено

Поліпшення продуктивності

1920×1080 (Full HD)

2832 FPS

3136 FPS

+10.7%

2560×1440 (QHD)

2008 FPS

2256 FPS

+12.3%

3840×2160 (4K)

1236 FPS

1436 FPS

+16.2%

7680×4320 (8K)

384 FPS

473 FPS

+23.1%

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

Примітка

Для ігор без віртуальної реальності вам, ймовірно, доведеться використовувати менш агресивну текстуру VRS, ніж у цьому прикладі. У результаті ефективний приріст продуктивності буде нижчим.