С поверхностными шейдерами: нет, вы не можете сделать это в шейдере.На самом деле, я думаю, что лучший способ получить единый мультипликационный эффект - использовать LUT с цветовой градацией в качестве пост-эффекта.Самое замечательное в LUT заключается в том, что вы легко можете создать его в фотошопе, сначала применив несколько классных эффектов к обычному изображению, пока оно не будет выглядеть так, как вы хотите (например, «Постеризовать»), а затем скопируйте стек эффектов, чтобы применить его к LUT.текстура, как этот .Когда вы используете этот LUT в Unity, все будет выглядеть так, как если бы вы использовали фильтры Photoshop.Однако я заметил одну небольшую оговорку: некоторые стандартные текстуры LUT необходимо перевернуть вертикально, чтобы работать со стеком постобработки. Здесь - хорошее руководство по созданию постеризированных LUT.
Если вы хотите получить тени, похожие на toon, непосредственно в шейдере, это не сложнее, чем создание обычного вершинного / фрагментного шейдера, отображаемого вперед, хотя это само по себе требует немного знаний о том, как они работают.- я могу порекомендовать посмотреть стандартный исходный код шейдера, , этот или , этот (несколько устаревший) учебник.Подробности о том, как добавить поддержку теней, вы можете найти в моем посте здесь .Единственное, что вам нужно изменить, это добавить аналогичную цветовую шкалу к теневой маске:
half shadow = SHADOW_ATTENUATION(IN)
shadow = tex2D(_ShadowRamp, float2(shadow, 0));
Для этого вы можете установить теневую рампу как глобальную переменную шейдера из скрипта., поэтому вам не придется назначать его для каждого материала.