Найти тему
Григорий Дядиченко

Unity и Matcap

Оглавление

Всем привет. Сегодня хотелось бы поговорить про такую технику как Matcap. Matcap или material captures — это техника которая позволяет "записать" материал имитируя освещение, отражения, блики. По сути маткап материал берёт информацию из подобной текстуры:

Текстура взята из https://github.com/nidorx/matcaps
Текстура взята из https://github.com/nidorx/matcaps

UV маппинг на модели рассчитывается через нормали посредством такого нехитрого шейдера:

-2

Для чего нужны маткапы. Во-первых, они в ряде случаев достаточно быстрые в реалтайме, так как позволяют анлит шейдерами с помощью одной текстуры имитировать материал со светом и отражениями на нём. Во-вторых, что даже в чём-то интереснее, с помощью matcap можно получать прикольную стилизованную текстуру на модели:

-3
-4

Где взять текстуры?

1. https://github.com/nidorx/matcaps — прикольный репозиторий с большой коллекцией разных маткап текстур
2.
https://www.youtube.com/watch?v=ruEb9mJuQpw — урок по созданию Matcap в Blender
3.
https://www.deviantart.com/sespider/art/163-FREE-MatCaps-258893793 — коллекция из 163 текстур (нужно зарегистрироваться на devianart)

А где же взять шейдер для Unity?

Во-первых, есть совершенно замечательный бесплатный ассет, в котором целая группа маткап шейдеров.

Во-вторых, так как я решил сейчас углубиться в изучение URP и HDRP, то я решил реализовать пару matcap шейдеров в шейдерграфе. Все примеры ниже есть в репозитории

Unlit Matcap Shader

-5

Такой шейдер кодом я уже выкладывал выше. Так как он тривиальный, то и его граф тривиален. Поэтому тут ничего интересного, можно взять в репозитории и пользоваться. Но в чём же плюс шейдер графа?

1. Поддержка всего и вся

У вас VR? Стерео рендер в сгенерированном шейдере обработан. Хотя я бы не стал использовать маткапы в VR, но об этом позже.

2. Легко включать и выключать тени

-6

Если в шейдере кодом нужно пробрасывать фолбеки, писать кастомные пассы, чтобы получить в шейдере реалтайм тени, то в шейдер графе это делается одной галочкой в настройках даже для Unlit шейдеров. Свет они конечно принимать не смогут, но тени вполне себе отбрасывают.

Галочка если что ставится тут
Галочка если что ставится тут

И ещё в шейдерграфе удобно настраивать прозрачность, параметры блендинга, куллинг и т.п. Кодом каждый раз приходится вспоминать, как это делается или находить шейдер, который "ты когда-то писал".

Unlit Bump Matcap Shader

-8

Тут уже сложнее понять что происходит. Так как шейдер сложнее и есть ряд нюансов. В целом, так как у нас uv рассчитываются по нормалям, то карта нормалей даёт дополнительные возможности для визуализации, задать фактуру объекту.

-9

Но сразу стоит уточнить, что объекты с мелкой или сложной фактурой будут давать артефакты визуализации. Так вот, если в прошлом шейдере в реализации шейдер графом всё было просто, то в этом уже начался призыв чего-то страшного:

-10

Получившаяся пентаграмма в графе (и это я ещё её аккуратно уложил) в реальности реализация шести довольно простых строчек кода:

-11

Поэтому я не скажу, что подобную математику на шейдер графе делать удобно. Весь шейдер можно посмотреть тут.

Чем может быть полезен Matcap в играх и визуализациях?

Стоит поговорить о плюсах и минусах. Плюсов мы уже касались:

1. Быстро работает
2. Интересный и красивый визуал

Но теперь о минусах:

1. Плоские поверхности

-12

Вот у нас сфера и тот же материал на кубе (и это ещё без динамики). Как следует из принципа работы material capture. Для красивого визуала ему нужны нормали. Любая плоская поверхность превращается в монотонный цвет, так как на всех вертексах одинаковое направление нормалей. Обычно это можно исправлять комбинируя Lit пол (как раз для теней реалтайм в довесок) и Matcap объекты. Можно написать вариацию даже Matcap-Lit или пасс для обработки теней, чтобы они принимали на себя тени. И получить уникальную интересную визуализацию.

2. Это имитация

-13

Всё неплохо смотрится на сложных объектах, в изометрии. Но по своей сути маткап имитирует единственный источник света. Он никак не учитывает соседние объекты, окружение и т.п. И даёт некоторый ряд артефактов в случае перспективной камеры. Если же брать изометрическую камеру, то всё шикарно, и получается очень красивый визуал:

-14

Поэтому как техника — Matcap лучше подходит для изометрии, с камерой которая движется по геймплею на каком-то расстоянии. И шикарно позволяет имитировать разные эффекты при креативном подходе. Допустим зелёный материал выше очень похож на подповерхностное рассеивание, которое для реального времени в мобилках — очень дорогое.

И по этой причине эта техника совершенно не подходит для AR и VR проектов. Там артефакты становятся сразу очевидными.

В заключении

В общем Matcap — это довольно прикольная техника, которую можно комбинировать с другими, и которая отлично подходит для изометрических игр.

Спасибо за внимание! Если было интересно подписывайтесь тут и в telegram. Также продублирую ссылку на репозиторий. Как появится время сделаю более подробное сравнение таких характеристик как: производительность, вес билда, получающаяся картинка. В сравнении с остальными техниками оптимизации рендера для мобильных устройств, которые я знаю.