-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathCelShadingWindWaker.shader
72 lines (52 loc) · 1.85 KB
/
CelShadingWindWaker.shader
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
Author: Alberto Mellado Cruz
Date: 22/02/2018
Comments:
This is a Cel Shading of 2 thresholds with a blur between them.
It's intended to look like the shading in Wind Waker for GameCube.
*/
Shader "Custom/CelShadingWindWaker" {
Properties{
_Color("Color", Color) = (1,1,1,1) //Color multiplied to the texture
_MainTex("Albedo (RGB)", 2D) = "white" {} //Texture
_CelShadingBlurWidth("Cell Shading Blur Width", Range(0,2)) = 0.2 //Blur between thresholds
}
SubShader{
Tags{ "RenderType" = "Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Toon fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
sampler2D _RampTex;
struct Input {
float2 uv_MainTex;
};
half _CelShadingBlurWidth;
fixed4 _Color;
void surf(Input IN, inout SurfaceOutput o) {
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb;
o.Alpha = c.a;
}
fixed4 LightingToon(SurfaceOutput s, fixed3 lightDir,fixed atten)
{
half NdotL = dot(s.Normal, lightDir); //Value between 0 and 1
half cel;
/// 0 | threshold 1 | blur | threshold 2 | 1
/// 0 |**************|<- .5 ->|xxxxxxxxxxxxx| 1
if (NdotL < 0.5 - _CelShadingBlurWidth / 2) // Outside of the blur but dark
cel = 0;
else if (NdotL > 0.5 + _CelShadingBlurWidth / 2) // Outside of the blur but lit
cel = 1;
else // Inside of the blur
cel = 1- ((0.5 + _CelShadingBlurWidth / 2 - NdotL) / _CelShadingBlurWidth);
half4 c;
c.rgb = (cel + 0.3)/2.5 * s.Albedo * _LightColor0.rgb * atten; // So it does not look too lit
c.a = s.Alpha;
return c;
}
ENDCG
}
FallBack "Diffuse"
}