Toon Shader Shadow - PullRequest
       96

Toon Shader Shadow

1 голос
/ 15 марта 2019


В настоящее время я пытаюсь изменить свой стиль активов с реалистичного на низкий поли / карикатура.
Например, у меня есть шейдер поверхности Toon

half4 LightingRamp(SurfaceOutput s, half3 lightDir, half atten) {
    half NdotL = dot(s.Normal, lightDir);
    half diff = NdotL * 0.5 + 0.5;
    half3 ramp = tex2D(_LightingTex, float2(diff, 0)).rgb;
    half4 c;
    c.rgb = _LightColor0.rgb * atten * ramp *_Color;    
    c.a = s.Alpha;
    return c;
}

, где _LightingTex - 2Dрампа текстуры.Это прекрасно работает для световых эффектов на объектах самих .
Поскольку в моей сцене есть несколько объектов с этим шейдером, некоторые из них отбрасывают тень на мою стену .Как вы можете видеть, тень здесь не скат, а непрерывный градиент, как это делается (вероятно) в какой-то среде от единства.Мой вопрос сейчас: есть ли возможность создать этот эффект colorramp и для глобальных теней?Что-то вроде this : Могу ли я сделать это на основе материала шейдера, или это эффект постобработки?
Спасибо

1 Ответ

0 голосов
/ 18 марта 2019

С поверхностными шейдерами: нет, вы не можете сделать это в шейдере.На самом деле, я думаю, что лучший способ получить единый мультипликационный эффект - использовать LUT с цветовой градацией в качестве пост-эффекта.Самое замечательное в LUT заключается в том, что вы легко можете создать его в фотошопе, сначала применив несколько классных эффектов к обычному изображению, пока оно не будет выглядеть так, как вы хотите (например, «Постеризовать»), а затем скопируйте стек эффектов, чтобы применить его к LUT.текстура, как этот .Когда вы используете этот LUT в Unity, все будет выглядеть так, как если бы вы использовали фильтры Photoshop.Однако я заметил одну небольшую оговорку: некоторые стандартные текстуры LUT необходимо перевернуть вертикально, чтобы работать со стеком постобработки. Здесь - хорошее руководство по созданию постеризированных LUT.

Если вы хотите получить тени, похожие на toon, непосредственно в шейдере, это не сложнее, чем создание обычного вершинного / фрагментного шейдера, отображаемого вперед, хотя это само по себе требует немного знаний о том, как они работают.- я могу порекомендовать посмотреть стандартный исходный код шейдера, , этот или , этот (несколько устаревший) учебник.Подробности о том, как добавить поддержку теней, вы можете найти в моем посте здесь .Единственное, что вам нужно изменить, это добавить аналогичную цветовую шкалу к теневой маске:

half shadow = SHADOW_ATTENUATION(IN)
shadow = tex2D(_ShadowRamp, float2(shadow, 0));

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

...