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”, в качестве фактора смешивания используя полученный круг с градиентом.

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

Nikita

Автор: Nikita

Blender add-ons developer and articles writer.