Архив метки: Unity



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

Ранее мы подготовили сцену для работы с HDRP. Сначала я попытался добавить просто куб, уменьшенный в глубину, чтобы получилось что-то похожее на стекло, но настройки. которые подходили для стандартного шейдера, с HDRP не сработали. Будем разбираться…
Для объекта Куб, изображающего «стекло» я установил такие параметры:
1. В разделе Transform установим размеры (Scale):

x=1.3127
y=1
z=0.008

Значение z — это как раз толщина «стекла».
2. Создадим материал «стекло»:
ProjectAssetsMaterialsCreateMaterial
3. Зададим новому материалу имя: Glass_Mat (по-умолчанию для него выбран шейдер HDRP/Lit).
4. Как и раньше, выберем для него такие настройки:
Surface OptionsSurface Type = Transparent
Surface InputsBase MapAlpha = 10
5. Изменим значения Metallic и Smoothness:
Surface InputsMetallic = 0.5
Surface InputsSmoothness = 1

Мы не задействовали Reflection Probe, при этом отражения в стекле видны. Проблема в том, что эти отражения какие-то искажённые и геометрически неверные:

Всё дело в том, что на сцене уже есть несколько reflection probe!

 

6. Мы выяснили, в чём именно проблема с отражениями, поэтому удалим со сцены старые объекты Reflection Probes (можно не удалять, а просто деактивировать их):
HierarchySampleSceneExampleAssetsReflection Probes

Вообще они были нужны для создания отдельных эффектов. Поскольку это не моя сцена, а пример, я не хочу разбираться, для чего их поместили на сцену. В идеале, для каждой из них нужно настроить «вес», чтобы они не конфликтовали друг с другом! Например:
Reflection Probe MainReflection ProbeRender SettingsWeight
Изменяя параметр «вес» можно настроить приоритет каждой из Reflection Probes

 

7. Через контекстное меню добавим свою собственную Reflection Probe:
LightReflection Probe

По-умолчанию выставлен режим Baked, поэтому чтобы сформировать отражения на поверхности стекла, нужно нажать на кнопку Bake внизу панели компонента Reflection Probe.

 

Мы добавили свою собственную reflection probe, а другие деактивировали и искажения пропали, но отражение стало слишком сильно увеличено:

В отличие от Standard Render Pipeline, новая система High Definition Render Pipeline, требует создания дополнительного объекта — Reflection Proxy Volume Component. На текущий момент я не нашёл ни одного нормального мануала к HDRP. Хотя на YouTube достаточно инструкций, но по какой-то причине в них не уделяется внимание настройке Reflection Proxy Volume. Даже в этом официальном видео этой настройке не уделили внимание!

 

8. Не знаю, как правильно, поэтому просто добавлю его к текущему объекту Reflection Probe:
Reflection ProbeAdd ComponentReflection Proxy Volume
9. Откроем в Инспекторе свойства объекта Reflection Probe и обратим внимание на раздел Projection Settings (на скриншоте видно, что сейчас там ничего не выставлено):

10. Выберем для этого поля значение из п.8 (в списке оно будет называться как и наш объект — Reflection Probe):

11. После добавления Reflection Proxy Volume, масштаб отражений в стекле стал больше соответствовать реальности:

Можно было не добавлять «Reflection Proxy Volume», а установить галочку «Use Influence Volume As Proxy Volume», но в моём примере размеры отражения всё равно кажутся несколько великоватыми. В общем, скорее всего скоро опять что-то изменят и данная инструкция будет неверной…

 



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 лесенки почти пропали:

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