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

Полный исходный код можно найти внизу этой статьи, но сначала я попытаюсь пройтись по разным частям шейдера.

Рассеянный свет

Шейдер берет основную текстуру и цвет альбедо (множитель). Он также использует текстуру мультяшного ската, которая контролирует затухание рассеянного света.

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

Зеркальный блик

Зеркальное выделение можно включить или выключить с помощью флажка. Во-первых, можно установить значение блеска, чтобы контролировать, насколько большим должен быть блик (да, вероятно, его следует назвать «Spec size» или что-то более разумное). Затем можно установить значение интенсивности отражения, чтобы управлять интенсивностью подсветки. Наконец, затухание светлых участков контролируется текстурой рампы.

Зеркальный свет рассчитывается относительно источника света и направления взгляда (как и все зеркальные блики). Тем не менее, я думаю, что установка, описанная выше, лучше подходит для «многообразного» рассеянного света по сравнению с более традиционной зеркальной установкой Блинна-Фонга.

Рамлайт

Подсветку также можно переключить с помощью флажка «Включено». На самом деле ничего особенного, просто стандартная фара. Я действительно думаю, что он неплохо дополнял остальную часть легкой модели.

Тени

Материалы, конечно, будут иметь более темные области из-за расчетов рассеянного света. Флажок «Получить тени» также позволяет использовать тени от других объектов (для которых заданы тени от случая). Тем не менее, стандартные тени Unity, как правило, имеют довольно гладкие края, что на самом деле не соответствует остальной части резкого/ячеистого затухания света. Поэтому я также добавил текстуру рампы для полученных теней. Оказалось, что я не могу использовать диффузный скат (почему так и не понял), поэтому для теневого ската есть отдельная текстура.

Вот окончательный исходный код!