Шейдер призрачной колбы

Шейдер призрачной колбы

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


Код шейдера:

Объяснение

Это простой двухпроходный (two-pass) шейдер.
Первый проход (ZTest Greater) рендерит пиксели, если расстояние между объектом и камерой в координате этого пикселя больше, чем значение в Z буфере (ZBuffer) - это значит наш объект перекрыт каким-то другим объектом.

Второй проход (ZTest LEqual) рендерит пиксели, если расстояние меньше или равно значению в Z буфере. Аналогично обычному рендеру.

Вершинные шейдеры (Vertex shaders) идентичны:

Мы преобразуем координаты и нормали, вычисляем направление от точки к камере и преобразуем UV-координаты, для поддержки тайлинга.

Фрагментные шейдеры (Fragment shaders) также идентичны, но с одним исключением: первый проход использует цвет из свойство _BlockedColor (у нас в игре - красный), второй использует _NormalColor (бледно-желтый). Мы будем использовать второй в качестве примера.

Первая строка:

Скалярное произведение между вектором направления камеры и нормалью показывает сходство между углами этих векторов.
«1» означает, что они однонаправлены, «0» означает угол 90º, «-1» - если они противоположны (но такого не произойдет, потому что эта геометрия обрезается благодаря директиве cut off). Вычитаем это значение из единицы, чтобы получить противоположный эффект. Впоследствии это будет наша альфа - края объекта, отвернутые от камеры, будут отлично видны, а полигоны, обращенные непосредственно к камере, видны не будут.
Это дает отличный призрачный эффект - такой подход используется для изображения призраков во многих играх.

Вторая строка:

Давайте умножим результаты и запишем значение в альфа-канал возвращаемого цвета. Умножим все это на _Multiplier - что позволит контролировать прозрачность из материала.
В конце умножим на _Animation, чтобы установить анимацию появления/исчезновения, изменяя это значение с нуля на единицу и плавно возвращаясь назад к нулю.

Последняя строка пояснений не требует:

В общем-то, это все. Если у вас есть какие-либо вопросы, пожалуйста, свяжитесь с нами в соц сетях или напишите имейл!

Поделись, если было полезно!