Вам понадобятся два Unlit шейдера, базовые знания Universal Render Pipeline и заготовка для камня с правильной развёрткой.
Для камней можно взять 3D модели любой подходящей формы. Главное — правильно сделать развёртку. Каждая грань камня — это отдельный шелл. За счёт этого, когда на меш наложат динамическую текстуру, каждая грань будет играть на свету.
На следующем шаге нужно создать два Unlit шейдера — на скриншоте ниже они названы Cristal Color и Cristal Light.
В отличие от встроенного рендера Unity, Universal Render Pipeline не поддерживает шейдеры с несколькими проходами (multiple passes). Поэтому нужно создать два шейдера — для цвета (CristalColor) и для света (CristalLight).
InfinityStone на скриншоте ниже — это пустой объект, парент для двух одинаковых мешей (Layer_Color, Layer_Light). Каждому объекту будет назначен свой материал.
Шейдер состоит из трёх больших групп нод:
Texture;
Reflection;
Color.
Texture
По словам разработчиков, это самая важная группа шейдера, потому что именно она отвечает за блеск. Блики на гранях могут быть самой разной формы, но в данном случае они сделаны с помощью динамической текстуры, описанной в книге Book of Shaders (на GLSL). Благодаря такому способу форму бликов (треугольник, квадрат, пятиугольник) можно переключать по своему желанию, задавая количество вершин.
Важная особенность скрипта, который используют для своей текстуры разработчики — некоторые значения передаются как аргументы, чтобы их можно было менять в реальном времени.
Аргументы функции Texture_float, где создаётся динамическая текстура, передаются на входы и выход ноды Custom Function.
Reflection
В Reflection передаётся CubeMap.
Color
Группа Color отвечает за базовый цвет, который зависит от освещения — это реализовано с помощью ноды Fresnel Effect, имитирующей эфект Френеля. Спектр цветов камня задаётся через четырёхмерный вектор Vector 4.
На выходе результат сложения групп Texture и Reflection (нода Add) умножается на результат Color (нода Multiply).
Результат работы шейдера цвета:
Шейдер света состоит из чертырёх больших групп нод:
Base Light;
Base Specular;
Anisotropic Specular;
Fresnel Light.
В трёх группах, кроме стандартных нод, задействованы ноды Custom Function.
Base Light
В Base Light рассчитываются такие параметры, как направление, цвет и затухание света.
Base Specular
Группа Base Specular отвечает за зеркальность.
Anisotropic Specular
Ещё один тип зеркальности, который понадобится для камней — анизотропный. Группа Anisotropic Specular отвечает за то, чтобы отражение на гранях зависело от их нормалей.
Fresnel Light
В этой группе с помощью ноды Fresnel Effect имитируется жёсткий свет на краях граней.
Так как зеркальность нельзя посчитать без параметров направления света (direction), цвета (color) и затухания (dimming), результаты Base Light идут на входы нод из групп Base Specular и Anisotropic Specular.
Группа Base Specular суммируется с Anisotropic Specular, на следующем шаге добавляется Fresnel Light (см. скриншот ниже).
Полученный результат можно помножить (нода Multiply) на Specular Color, чтобы иметь возможность менять цвет в инспекторе. Но так как цвет в нашем случае задаётся в отдельном шейдере, для параметра Surface нужно выбрать значение Transparent, а для Blend — Additive.
Результат работы двух шейдеров и доступные в инспекторе настройки материалов:
Если вы хотите научиться работать в Unity, советуем вам пройти наш курс от Unity-разработчика из Pixonic Алексея Малороссиянова. На курсе мы научим вас создавать сцены, интерфейсы и механики для собственных 2D-игр при помощи Unity и C#.