Затенение с переменной скоростью

Что такое затенение с переменной скоростью?

В современных движках 3D-рендеринга шейдеры стали намного сложнее, чем раньше. Появление физически обоснованного рендеринга, глобального освещения в реальном времени и эффектов экранного пространства увеличило количество попиксельных затенений, которые необходимо выполнить для рендеринга каждого кадра. Кроме того, разрешения экрана также значительно возросли, и теперь распространенными целевыми разрешениями являются 1440p и 4K. В результате общая стоимость затенения при рендеринге сцены обычно составляет значительную часть времени, необходимого для рендеринга каждого кадра.

Затенение с переменной скоростью (VRS) — это метод снижения стоимости затенения путем снижения разрешения попиксельного затенения (также называемого фрагментным затенением), сохраняя при этом исходное разрешение для рендеринга геометрии. Это означает, что края геометрии остаются такими же резкими, как и без VRS. VRS можно комбинировать с любой техникой 3D сглаживание (MSAA, FXAA, TAA, SSAA).

VRS позволяет локально задавать качество затенения, что позволяет определенным частям области просмотра получать более детальное затенение, чем другим. Это особенно полезно в виртуальной реальности (VR) для достижения фовеального рендеринга, когда центр области просмотра более детализирован, чем края.

Ниже представлена сцена, визуализированная с отключенным и включенным затенением скорости с использованием карты плотности, ссылка на которую приведена в нижней части этой страницы:

В текстурированной сцене отключено затенение с переменной скоростью

В текстурированной сцене отключено затенение с переменной скоростью

В текстурированной сцене включено затенение с переменной скоростью (более низкое качество, но более высокая производительность)

В текстурированной сцене включено затенение с переменной скоростью (более низкое качество, но более высокая производительность)

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

В нетекстурированной сцене отключено затенение с переменной скоростью

В нетекстурированной сцене отключено затенение с переменной скоростью

В нетекстурированной сцене включено затенение с переменной скоростью (более низкое качество, но более высокая производительность)

В нетекстурированной сцене включено затенение с переменной скоростью (более низкое качество, но более высокая производительность)

Поддержка оборудования

Затенение с переменной скоростью поддерживается только на определенных графических процессорах:

Desktop (Рабочий стол):

  • 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-режиме отображения.

Compatibility renderer не поддерживает затенение с переменной скоростью. Для XR вы можете использовать foveation level в качестве альтернативы.

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

  • Mode: управляет режимом затенения с переменной скоростью. Disabled отключает затенение с переменной скоростью. Texture использует вручную созданную текстуру для установки плотности затенения (см. свойство ниже). XR автоматически генерирует текстуру, подходящую для фовеального рендеринга в виртуальной/дополненной реальности.

  • Texture: Текстура, используемая для управления плотностью затенения в корневом окне просмотра. Используется только если Mode равен Texture.

Для пользовательских видовых экранов режим VRS и текстура должны быть установлены вручную для узла Viewport.

Примечание

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

Создание карты плотности VRS

При использовании режима VRS Texture вы должны установить текстуру, которая будет использоваться в качестве карты плотности. В противном случае никакого эффекта не будет видно.

Вы можете создать собственную карту плотности VRS вручную с помощью редактора изображений или сгенерировать ее другим методом (например, на CPU с помощью класса 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).

Совет

При использовании затенения с переменной скоростью можно использовать отрицательное смещение LOD mipmap текстуры, чтобы уменьшить размытость в областях с пониженной скоростью затенения.

Обратите внимание, что смещение 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%

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

Примечание

Для игр без VR вам, вероятно, придется использовать менее агрессивную текстуру VRS, чем та, что использовалась в этом примере. В результате эффективный прирост производительности будет ниже.