miepzerino
2023-12-15 cef5e20697fe3e89d6e77e2195ed0ac796656094
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
94
95
96
97
98
99
100
101
void VertShader(inout appdata_full v, out Input data)
{
    v.vertex.x += _VertexOffsetX;
    v.vertex.y += _VertexOffsetY;
 
    UNITY_INITIALIZE_OUTPUT(Input, data);
 
    float bold = step(v.texcoord1.y, 0);
 
    // Generate normal for backface
    float3 view = ObjSpaceViewDir(v.vertex);
    v.normal *= sign(dot(v.normal, view));
 
#if USE_DERIVATIVE
    data.param.y = 1;
#else
    float4 vert = v.vertex;
    float4 vPosition = UnityObjectToClipPos(vert);
    float2 pixelSize = vPosition.w;
 
    pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy);
    float scale = rsqrt(dot(pixelSize, pixelSize));
    scale *= abs(v.texcoord1.y) * _GradientScale * (_Sharpness + 1);
    scale = lerp(scale * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
    data.param.y = scale;
#endif
 
    data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; // 
 
    v.texcoord1.xy = UnpackUV(v.texcoord1.x);
    data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex));
}
 
void PixShader(Input input, inout SurfaceOutput o)
{
 
#if USE_DERIVATIVE
    float2 pixelSize = float2(ddx(input.uv_MainTex.y), ddy(input.uv_MainTex.y));
    pixelSize *= _TextureWidth * .75;
    float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1);
#else
    float scale = input.param.y;
#endif
 
    // Signed distance
    float c = tex2D(_MainTex, input.uv_MainTex).a;
    float sd = (.5 - c - input.param.x) * scale + .5;
    float outline = _OutlineWidth*_ScaleRatioA * scale;
    float softness = _OutlineSoftness*_ScaleRatioA * scale;
 
    // Color & Alpha
    float4 faceColor = _FaceColor;
    float4 outlineColor = _OutlineColor;
    faceColor *= input.color;
    outlineColor.a *= input.color.a;
    faceColor *= tex2D(_FaceTex, float2(input.uv2_FaceTex.x + _FaceUVSpeedX * _Time.y, input.uv2_FaceTex.y + _FaceUVSpeedY * _Time.y));
    outlineColor *= tex2D(_OutlineTex, float2(input.uv2_OutlineTex.x + _OutlineUVSpeedX * _Time.y, input.uv2_OutlineTex.y + _OutlineUVSpeedY * _Time.y));
    faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
    faceColor.rgb /= max(faceColor.a, 0.0001);
 
#if BEVEL_ON
    float3 delta = float3(1.0 / _TextureWidth, 1.0 / _TextureHeight, 0.0);
 
    float4 smp4x = {tex2D(_MainTex, input.uv_MainTex - delta.xz).a,
                    tex2D(_MainTex, input.uv_MainTex + delta.xz).a,
                    tex2D(_MainTex, input.uv_MainTex - delta.zy).a,
                    tex2D(_MainTex, input.uv_MainTex + delta.zy).a };
 
    // Face Normal
    float3 n = GetSurfaceNormal(smp4x, input.param.x);
 
    // Bumpmap
    float3 bump = UnpackNormal(tex2D(_BumpMap, input.uv2_FaceTex.xy)).xyz;
    bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
    bump = lerp(float3(0, 0, 1), bump, faceColor.a);
    n = normalize(n - bump);
 
    // Cubemap reflection
    fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDirEnv, mul((float3x3)unity_ObjectToWorld, n)));
    float3 emission = reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
#else
    float3 n = float3(0, 0, -1);
    float3 emission = float3(0, 0, 0);
#endif
    
#if GLOW_ON
    float4 glowColor = GetGlowColor(sd, scale);
    glowColor.a *= input.color.a;
    emission += glowColor.rgb*glowColor.a;
    faceColor = BlendARGB(glowColor, faceColor);
    faceColor.rgb /= max(faceColor.a, 0.0001);
#endif
 
    // Set Standard output structure
    o.Albedo = faceColor.rgb;
    o.Normal = -n;
    o.Emission = emission;
    o.Specular = lerp(_FaceShininess, _OutlineShininess, saturate(sd + outline * 0.5));
    o.Gloss = 1;
    o.Alpha = faceColor.a;
}