/
ToonCutoutBase.cginc
93 lines (77 loc) · 2.07 KB
/
ToonCutoutBase.cginc
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#ifndef TOON_CUTOUT_INCLUDED
#define TOON_CUTOUT_INCLUDED
#include "./ToonUtil.cginc"
struct Input
{
float2 uv_MainTex;
float3 viewDir;
float3 worldNormal; INTERNAL_DATA
float3 worldRefl;
float3 cameraDir;
fixed facing : VFACE;
float4 screenPos;
};
sampler2D _MainTex;
sampler2D _BumpMap;
half _BumpMapIntensity;
sampler2D _Dark;
//sampler2D _VerticalMult;
half _EdgeStart;
half _EdgeEnd;
half _EdgeIntensity;
half _EdgeDarkMult;
//half _EdgeLuminanceMult;
half _AlphaCutoff;
float4 _EdgeColor;
void vert(inout appdata_full v, out Input o) {
UNITY_INITIALIZE_OUTPUT(Input, o);
#if !UNITY_PASS_SHADOWCASTER
o.cameraDir = mul(unity_ObjectToWorld, v.vertex) - _WorldSpaceCameraPos;
#endif
}
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
void surf(Input IN, inout SurfaceOutputToon o)
{
fixed4 c = tex2D(_MainTex, IN.uv_MainTex);
clip(c.a - _AlphaCutoff);
//clip(isDithered(IN.screenPos.xy / IN.screenPos.w, c.a));
#if !UNITY_PASS_SHADOWCASTER
#if _USE_DYNAMIC_DARK_COLORS
fixed3 d = HSVToRGB(Saturation(RGBToHSV(c.rgb * 0.5), 1.2));
#else
fixed3 d = tex2D(_Dark, IN.uv_MainTex).rgb;
#endif
#if _NORMALMAP
float3 n = lerp(half3(0, 0, 1), UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex)), _BumpMapIntensity);
o.Normal = IN.facing > 0 ? n : -n;
#endif
float3 pixelNormal = WorldNormalVector(IN, o.Normal);
#if _USE_SPECULAR
o.Refl = WorldReflectionVector(IN, o.Normal);
#endif
half edge = smoothstep(_EdgeEnd, _EdgeStart, dot(pixelNormal, normalize(IN.cameraDir)));
#if _EDGE_VERTICAL_VECTOR
half verticalLight = smoothstep(0.307, 0.55, dot(pixelNormal, half3(0, 1, 0)) * 0.5 + 0.5);
half rim = edge * verticalLight;
#else
half rim = edge;
#endif
o.Alpha = 1.0;
half ll = Luminance(c.rgb);
half dl = Luminance(d);
half3 lightRim = rim
#if _USE_LUMINANCE
* pow(1 + ll, 4)
#endif
* _EdgeIntensity * _EdgeColor.rgb;
half3 darkRim = rim
#if _USE_LUMINANCE
* pow(1 + dl, 4)
#endif
* _EdgeIntensity * _EdgeColor.rgb;
o.Albedo = c.rgb + lightRim;
o.Dark = d + darkRim * _EdgeDarkMult;
#endif
}
#endif