Архив за день: 09.12.2021



Unity: Создание материала ‘Стекло’ с помощью HDRP

Давным-давно я рассказывал, как сделать эффект стекла, используя стандартный шейдер и Reflection Probe. Движок Unity развивается и уже какое-то время используется пакет High Definition RP. Здесь уже появляется гораздо больше возможностей для работы с материалом объекта, его физическими свойствами, которые влияют на визуализацию этого объекта. Сначала я хотел просто вернуться к нашей сцене из демо Tanks Tutorial, чтобы его протестировать, но потом решил использовать проект из ссылки. Проблемой оказалось то, что данного шаблона больше нет в текущей версии Unity. Чтобы его скачать, мне пришлось сначала поставить Unity 2018.4.36f1, при этом при запуске выбрать шаблон «3D With Extras»:

Конвертация проекта в HDRP

1. Для начала установим пакет High Definition RP:
WindowPackage ManagerPackages: Unity RegistryHigh Definition RPInstall
2. После установки будет открыт Мастер настройки Render Pipeline Wizard.

Если Мастер не запустился, его можно запустить вручную:
WindowRender PipelineHD Render Pipeline Wizard

 

3. В окошке Render Pipeline Wizard нажимаем кнопку Fix All

4. После этого нам будет предложено создать ассет HDRenderPipeline, сделаем это:

5. Текущая сцена не рендерится корректно и окрасилась в пурпурный цвет, поэтому её материалы необходимо конвертировать (в том же диалоге кнопка Upgrade Project Materials to High Definition Materials):

Если вы случайно закрыли это окошко, конвертировать можно через меню:
EditRender PipelineHD Render PipelineUpgrade from build-in PipelineUpgrade Project Materials to High Definition Materials

 

Пурпурный цвет исчез, но всё стало каким-то серым — проблема с освещением, которую тоже нужно исправить.

 

Настройка освещения

6. Добавляем на сцену новый объект Sky Volume:
GameObjectVolumeSky and Fog Volume
7. Открываем окошко настроек освещения:
WindowRenderingLighting
8. Переходим на вкладку Environment, где мы выбираем нужный нам профиль (Sky and Fog Settings Profile):

9. Меняем настройки освещения неба:
Static Lighting Sky = PhysicallyBasedSky

В данный момент все тени низкого качества. Чтобы это исправить, перейдём к следующему шагу.

 

10. Через меню добавляем новый объект с настройками Global Volume:
GameObjectVolumeGlobal Volume
11. Нажав в инспекторе кнопочку New, создаём для него новый профиль:

12. Для теней создаём новое правило Override:
Add OverrideShadowingShadows:

13. Здесь мы меняем только одну настройку — максимальная дистанция (сначала включим галочкой настройку Max Distance):
Max Distance = 50

В руководстве по миграции указано, что для объекта Directional light нужно поменять интенсивность на 100000 и цвет на белый. Но у меня и без этого вроде всё нормально, просто нужно было выбрать в Инспекторе объект Directional Light — после выбора освещение будет сгенерировано заново.

 

14. Поскольку экспозиция сцены слишком большая, нужно её отрегулировать, для этого выбираем на сцене наш объект Global Volume и в Инспекторе добавляем новое правило:
Global VolumeVolumeAdd OverrideExposure
15. Для этого правила меняем значение режима экспозиции на Автоматическое:
Mode = Automatic

16. В настройках отображения сцены можно установить опцию Always Refresh, чтобы обновить настройки освещения:

Если на сцене присутствовали Light cookie, то их тоже нужно обновить. В отличие от HDRP, старый формат поддерживал только текстуры, в которых хранились только значения прозрачности.

 

17. В окошке Проекта выберем их:
ProjectAssetsExampleAssetsTexturesLight_CookiesSpotlight_Cookie
18. В Инспекторе поменяем для них некоторые свойства:
Texture Type = Default
Wrap Mode = Clamp

Исправим настройки освещения (прожекторов)

 

19. Для этого выберем прожектор в окне Иерархии:
HierarchyExampleAssetsPropsConstructionLightSpot Light
20. В Инспекторе для него установим новые значения Интенсивности:
Intensity = 17000

Это значение определяет интенсивность света, выдаваемую двумя лампами по 8500 люмен каждая.

 

21. Для этого же компонента включим и активируем скрытую настройку Reflector в разделе Emission:

Эта опция включила отражения перегородок, т.о. мы будем видеть их тени на стене.

 

22. Поскольку у нас была отключена опция автоматической генерации освещения сцены, выполним процедуру вручную (либо включим опцию Auto Generate):
WindowRenderingLightingGenerate Lighting:

Постобработка

В HDRP реализована своя собственная система постобработки изображения сцены, поэтому мы удаляем со сцены старый объект Post-process Volume и вместо него будем использовать встроенный инструмент.

 

23. В окне Иерархии выделяем объект Post-process Volume и удаляем его.
24. Для постобработки создадим новый объект настроек:
GameObjectVolumeGlobal Volume
25. Переименуем этот объект в «Post-processes»

В мануале ничего не сказано по поводу профиля для вновь созданного Global Volume, поэтому не буду использовать старый профиль, а создам новый (хотя может можно использовать и старый из п.10, наверное зависит от масштаба проекта и дальнейшей работой с настройками)

 
26. Кнопкой New создадим новый профиль:

27. Далее добавим к нему настройки кнопками Add OverridePost-processing:

  • Tonemapping — тут включаем опцию Mode и выставляем её значение в ACES
  • Bloom — отмечаем галочкой только Intensity = 0.2
  • Motion Blur — то же самое, но значение делаем равным 0.1 (Intensity = 0.1)
  • Vignette — как и ранее, но с другими значениями: Intensity = 0.55, Smoothness = 0.4 и Roundness = 0
  • Depth Of FieldFocus Mode = Manual, Near Range = 0 — 0.5, Far Range = 2 — 10
    У меня в Unity 2020.3.23f почему-то при значении Far Range End < 2067 перестаёт отображаться небо и вместо него всё заменяется на чёрный цвет. Чтобы этого не произошло, мне пришлось для камеры выставить значение Clipping Planes Far <= 7.66406 (по умолчанию было 1000):

     

28. В Иерархии выберем объект Global Volume, созданный в п.10
29. Добавим для него новую настройку:
Add OverrideLightingAmbient Occlusion
30. Установим для неё такие значения:
Intensity = 0.5

Хотя, при использовании Ambient Occlusion, лично я разницы не заметил.

 

Вроде всё, как в уроке, но мне не нравятся «лесенки», поэтому включу Anti-Aliasing.
31. В Иерархии выберем камеру (Main Camera) и в Инспекторе включим AA:
Main CameraPost Anti-AliasingSubpixel Morphological Anti-aliasing (SMAA)

После включения Anti-Aliasing лесенки почти пропали:

Получилось довольно много, но мы так и не дошли до процесса создания стекла. Его я опишу в следующей заметке.