Shadow catcher в EEVEE

В рендер-движке Cycles есть удобная возможность отрендерить объект с тенью на прозрачном фоне с помощью материала с функцией рендера только падающих на него теней «shadow catcher». В рендер-движке EEVEE такой функции у материалов нет. Однако в EEVEE можно собрать свой «shadow catcher» на основе нодов.

Готовый материал «EEVEE Shadow Catcher» можно скачать в библиотеке BIS.

  1. Для начала создадим простую сцену:

Добавим плоскость, которая будет служить «кэтчером»

shift+a — Mesh — Plane

и разместим на ней любой объект.

Добавим источник освещения

shift+a — Light — Spot

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

Переключимся на рендер-движок EEVEE и перейдем в режим «Rendered» (z — 8).

  1. Откроем окно Shader Editor и для плоскости добавим новый материал.

Заменим шейдер Principled BSDF на простой шейдер Diffuse.

  1. В EEVEE есть очень полезный нод «Shader to RGB», который переводит итоговый шейдер, с рассчитанными бликами и тенями, в простой цвет. Обычно этот нод используется для цветокоррекции, мы же с его помощью сделаем наш «shadow catcher».

Добавим нод «Shader to RGB»

shift+a — Converter — Shader to RGB

после нода «Diffuse BSDF».

На выходе «Color» этого нода мы получаем собственно то, что видим на экране пререндера — белый круг от освещения и тень, отбрасываемую объектом.

Добавим нод «RGB to BW» чтобы исключить влияние света и получить черно-белую маску.

shift+a — Converter — RGB to BW

Добавим еще два нода «Mix Shader» и «Transparent BSDF»

shift+a — Shader — Mix Shader

shift+a — Shader — Transparent BSDF

и соединим их следующим образом, используя полученную маску, как фактор смешивания нода «прозрачности» с пустым нодом.

Для того, чтобы построенное дерево нодов заработало правильно, в настройках материала нужно установить режим «Blend Mode» в «Alpha Blend».

Для более четких теней режим «Shadow Mode» можно поставить в «None».

Как видим, наш «shadow catcher» уже работает и если например используются источники света типа «Sun», не дающие выраженного светового пятна, больше никаких изменений не требуется.

  1. Однако для других типов источников света нужна доработка — сделаем черную область вокруг светового пятна прозрачной.

Для этого смешаем еще раз шейдер прозрачности «Transparent BSDF» с тем, что у нас уже есть, взяв в качестве маски обычный круг.

Добавим в нодовое дерево ноды «Texture Coordinate», «Mapping», «Gradient Texture» и «Invert»:

shift+a — Input — Texture Coordinate

shift+a — Vector — Mapping

shift+a — Texture — Gradient Texture

shift+a — color — Invert

и соединим их следующим образом. Переключим режим работы нода «Gradient Texture» в «Spherical». Изменяя значения Location и Scale в ноде «Mapping», подгоним размер и положение круга так, чтобы он соответствовал границам светового пятна.

Все, что попадает за пределы черного градиента мы сделаем прозрачным.

Выделим нод «Mix Shader» и сдублируем его (shift+d).

Соединим новый нод «Mix Shader» с уже построенным деревом и еще раз с нодом «Transparent BSDF», в качестве фактора смешивания используя полученный круг с градиентом.

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