Внедрение затенения с переменной скоростью
Следуйте этому рабочему процессу, чтобы реализовать затенение на основе изображения с переменной скоростью (VRS), которое использует текстуру для определения скорости затенения по областям экрана.
- Проверить совместимость оборудования
- Создание функции рендеринга с возможностью использования сценариев
- Настройка текстур цветовой маски
- Создание изображения скорости затенения (SRI)
- Применить текстуру SRI к рендерингу
1. Проверка совместимости оборудования
Перед началом реализации убедитесь, что конечное устройство поддерживает затенение с переменной скоростью. Требования к совместимости платформ см. в разделе Поддерживаемые платформы. Для запроса поддержки используйте следующий пример кода:
if(!Vrs.IsColorMaskTextureConversionSupported()) {
Debug.Log("VRS is not supported");
return;
}
Дополнительную информацию см. в документации по Vrs.IsColorMaskTextureConversionSupported(). ShadingRateInfo класс позволяет проверить дополнительные возможности VRS, поддерживаемые целевым устройством.
2. Создание функции скриптового рендерера
Чтобы реализовать затенение с переменной скоростью в вашем проекте, вы должны создать Scriptable Renderer Feature для включения пользовательского прохода рендеринга в ваш конвейер рендеринга. Используйте RenderGraph API для написания пользовательского прохода рендеринга. Unity предоставляет VRS вспомогательные функции для сценария конвейера рендеринга (SRP) для упрощения реализации VRS в вашем пользовательском проходе рендеринга.
3. Настройка текстур цветовой маски
Текстура цветовой маски — это обычная текстура, которая использует цветовое кодирование для представления того, какая скорость затемнения использовать на экране.
1. Настройка системы отображения цветов
Просмотровая таблица VRS (LUT) отображает цвета на определенные скорости затемнения. Перед созданием LUT в коде настройте отображение цветов в Project Настройки. Выполните следующие действия:
Перейти в Изменить > Project Настройки > Графика > URP > VRS-Ресурсы Runtime.
-
Настройте следующие таблицы поиска:
- Таблица поиска преобразований: Определяет, какие цвета сопоставить с какими скоростями затенения при преобразовании из цветовой маски в SRI значения с
ColorMaskTextureToShadingRateImage. - Просмотровая таблица визуализации: Преобразования SRI цветов для визуализации отладочных значений с помощью
ShadingRateImageToColorMaskTexture.
- Таблица поиска преобразований: Определяет, какие цвета сопоставить с какими скоростями затенения при преобразовании из цветовой маски в SRI значения с
Сопоставление цветов по умолчанию:
- Красный: 1x1 (высокое качество)
- Зеленый: 2x2 (Среднее качество)
- Темно-синий: 4x4 (низкое качество)
После настройки значений цветов создайте LUT, который использует эти значения:
VrsLut vrsLut = VrsLut.CreateDefault();
Используйте следующий код, чтобы получить цвета для скорости затенения, так что вы можете использовать цвета для заполнения текстуры.
Color vrsColor1x1 = vrsLut[ShadingRateFragmentSize.FragmentSize1x1];
Color vrsColor2x2 = vrsLut[ShadingRateFragmentSize.FragmentSize2x2];
Color vrsColor4x4 = vrsLut[ShadingRateFragmentSize.FragmentSize4x4];
Используйте проход рендеринга для создания текстуры цветовой маски на CPU с использованием соответствующих цветов VRS из LUT.. В качестве альтернативы вы можете загрузить существующую текстуру с диска, например, если вы создаете текстуру цвета вручную.
Важная: Следующие шаги для расчетов размеров текстуры и создания цветовой маски требуются только в том случае, если вы создаете текстуру цветовой маски с помощью рабочего процесса рендеринга.
2. Расчет размеров текстуры для конкретного устройства
Размер текстуры VRS определяется количеством плиток, которые вписываются на экране, и может отличаться в зависимости от платформы. Вы должны запросить размер плитки, основанный на размерах вашего рендеринга.
var sizeInTiles = ShadingRateImage.GetAllocTileSize(renderTargetWidth, renderTargetHeight);
3. Создать цветовую маску VRS
Настройте дескриптор текстуры с необходимыми свойствами следующим образом:
RenderTextureDescriptor textureProperties = new RenderTextureDescriptor(sizeInTiles.x, sizeInTiles.y, RenderTextureFormat.Default, 0);
TextureHandle colorMask = UniversalRenderer.CreateRenderGraphTexture(renderGraph, textureProperties, "_ShadingRateColor", false);
4. Создание изображения скорости затенения (SRI)
Преобразовать текстуру цветовой маски в изображение скорости тени (SRI), которое содержит инструкции скорости тени для GPU. Unity обеспечивает ShadingRateImage класс, чтобы создавать такие текстуры и управлять ими на разных платформах.
Преобразуйте рендируемую маску цвета для создания изображения с естественной скоростью тени (SRI) следующим образом:
// Create texture descriptor for the shading rate image
RenderTextureDescriptor sriProperties = new RenderTextureDescriptor(sizeInTiles.x, sizeInTiles.y, ShadingRateInfo.graphicsFormat, GraphicsFormat.None);
sriProperties.enableRandomWrite = true;
sriProperties.enableShadingRate = true;
// Create shading rate image texture
TextureHandle sriTextureHandle = UniversalRenderer.CreateRenderGraphTexture(renderGraph, sriProperties, "_ShadingRateImage", false);
// Convert the color mask texture to native SRI format
Vrs.ColorMaskTextureToShadingRateImage(renderGraph, sriTextureHandle, colorMask, TextureDimension.Tex2D, true);
Используйте Frame Debugger для просмотра скорости затенения изображения в Unity Editor.
Чтобы визуализировать SRI в вашем приложении для целей отладки, используйте следующий код. Этот код преобразует SRI в стандартную цветовую текстуру, которую вы можете рендировать как любую другую текстуру в любом пользовательском проходе рендеринга.
Vrs.ShadingRateImageToColorMaskTexture(renderGraph, sriTextureHandle, sriDebugColorTextureHandle);
5. Применить текстуру SRI к рендерингу
После создания SRI примените его к созданному вами пользовательскому проходу рендеринга, чтобы включить затенение с переменной скоростью.
// Bind the SRI texture to the render pass and apply its per-tile shading rates.
if (sriTextureHandle.IsValid())
{
builder.SetShadingRateImageAttachment(sriTextureHandle);
builder.SetShadingRateCombiner(ShadingRateCombinerStage.Fragment, ShadingRateCombiner.Override);
}
Это привязывает текстуру VRS к следующему рисунку, который позволяет VRS.
Примечание: Вы можете установить фиксированную скорость затемнения для всего рисунка, используя SetShadingRateFragmentSize API.
Дополнительные ресурсы
- Оптимизация функций рендерера с затенением с переменной скоростью в Unity 6.1 (Unity Обсуждения)
- Демонстрационный проект скорости затенения
- VRS — Ресурсы Runtime
- Введение в затенение с переменной скоростью
- Профиль и отладка при использовании затенения с переменной скоростью