В рендер-движке Cycles есть удобная возможность отрендерить объект с тенью на прозрачном фоне с помощью материала с функцией рендера только падающих на него теней “shadow catcher”. В рендер-движке EEVEE такой функции у материалов нет. Однако в EEVEE можно собрать свой “shadow catcher” на основе нодов.
Готовый материал “EEVEE Shadow Catcher” можно скачать в библиотеке BIS.
- Для начала создадим простую сцену:
Добавим плоскость, которая будет служить “кэтчером”
shift+a – Mesh – Plane
и разместим на ней любой объект.
Добавим источник освещения
shift+a – Light – Spot
направим его на объект и настроим его положение и яркость так, чтобы он давал хорошо видимую тень.
Переключимся на рендер-движок EEVEE и перейдем в режим “Rendered” (z – 8).
- Откроем окно Shader Editor и для плоскости добавим новый материал.
Заменим шейдер Principled BSDF на простой шейдер Diffuse.
- В 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”, не дающие выраженного светового пятна, больше никаких изменений не требуется.
- Однако для других типов источников света нужна доработка – сделаем черную область вокруг светового пятна прозрачной.
Для этого смешаем еще раз шейдер прозрачности “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”, в качестве фактора смешивания используя полученный круг с градиентом.
Таким образом мы отсекли всю черноту вокруг светового пятна, оставив для рендера только тень.