Всем привет. Сегодня хотелось бы поговорить про такую технику как Matcap. Matcap или material captures — это техника которая позволяет "записать" материал имитируя освещение, отражения, блики. По сути маткап материал берёт информацию из подобной текстуры:
UV маппинг на модели рассчитывается через нормали посредством такого нехитрого шейдера:
Для чего нужны маткапы. Во-первых, они в ряде случаев достаточно быстрые в реалтайме, так как позволяют анлит шейдерами с помощью одной текстуры имитировать материал со светом и отражениями на нём. Во-вторых, что даже в чём-то интереснее, с помощью matcap можно получать прикольную стилизованную текстуру на модели:
Где взять текстуры?
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
Такой шейдер кодом я уже выкладывал выше. Так как он тривиальный, то и его граф тривиален. Поэтому тут ничего интересного, можно взять в репозитории и пользоваться. Но в чём же плюс шейдер графа?
1. Поддержка всего и вся
У вас VR? Стерео рендер в сгенерированном шейдере обработан. Хотя я бы не стал использовать маткапы в VR, но об этом позже.
2. Легко включать и выключать тени
Если в шейдере кодом нужно пробрасывать фолбеки, писать кастомные пассы, чтобы получить в шейдере реалтайм тени, то в шейдер графе это делается одной галочкой в настройках даже для Unlit шейдеров. Свет они конечно принимать не смогут, но тени вполне себе отбрасывают.
И ещё в шейдерграфе удобно настраивать прозрачность, параметры блендинга, куллинг и т.п. Кодом каждый раз приходится вспоминать, как это делается или находить шейдер, который "ты когда-то писал".
Unlit Bump Matcap Shader
Тут уже сложнее понять что происходит. Так как шейдер сложнее и есть ряд нюансов. В целом, так как у нас uv рассчитываются по нормалям, то карта нормалей даёт дополнительные возможности для визуализации, задать фактуру объекту.
Но сразу стоит уточнить, что объекты с мелкой или сложной фактурой будут давать артефакты визуализации. Так вот, если в прошлом шейдере в реализации шейдер графом всё было просто, то в этом уже начался призыв чего-то страшного:
Получившаяся пентаграмма в графе (и это я ещё её аккуратно уложил) в реальности реализация шести довольно простых строчек кода:
Поэтому я не скажу, что подобную математику на шейдер графе делать удобно. Весь шейдер можно посмотреть тут.
Чем может быть полезен Matcap в играх и визуализациях?
Стоит поговорить о плюсах и минусах. Плюсов мы уже касались:
1. Быстро работает
2. Интересный и красивый визуал
Но теперь о минусах:
1. Плоские поверхности
Вот у нас сфера и тот же материал на кубе (и это ещё без динамики). Как следует из принципа работы material capture. Для красивого визуала ему нужны нормали. Любая плоская поверхность превращается в монотонный цвет, так как на всех вертексах одинаковое направление нормалей. Обычно это можно исправлять комбинируя Lit пол (как раз для теней реалтайм в довесок) и Matcap объекты. Можно написать вариацию даже Matcap-Lit или пасс для обработки теней, чтобы они принимали на себя тени. И получить уникальную интересную визуализацию.
2. Это имитация
Всё неплохо смотрится на сложных объектах, в изометрии. Но по своей сути маткап имитирует единственный источник света. Он никак не учитывает соседние объекты, окружение и т.п. И даёт некоторый ряд артефактов в случае перспективной камеры. Если же брать изометрическую камеру, то всё шикарно, и получается очень красивый визуал:
Поэтому как техника — Matcap лучше подходит для изометрии, с камерой которая движется по геймплею на каком-то расстоянии. И шикарно позволяет имитировать разные эффекты при креативном подходе. Допустим зелёный материал выше очень похож на подповерхностное рассеивание, которое для реального времени в мобилках — очень дорогое.
И по этой причине эта техника совершенно не подходит для AR и VR проектов. Там артефакты становятся сразу очевидными.
В заключении
В общем Matcap — это довольно прикольная техника, которую можно комбинировать с другими, и которая отлично подходит для изометрических игр.
Спасибо за внимание! Если было интересно подписывайтесь тут и в telegram. Также продублирую ссылку на репозиторий. Как появится время сделаю более подробное сравнение таких характеристик как: производительность, вес билда, получающаяся картинка. В сравнении с остальными техниками оптимизации рендера для мобильных устройств, которые я знаю.