summaryrefslogtreecommitdiff
path: root/VRCSDK3AvatarsLegacy/Assets/_PoiyomiShaders/Shaders/Patreon/EyeFX/PoiyomiEyeFX.shader
blob: d965068a2e2e278ee53747383b069332a420bd8a (plain)
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
Shader ".poiyomi/Patreon/EyeFx"
{
    Properties 
  { 
      [HideInInspector] shader_is_using_thry_editor("", Float)=0
        _MainTex ("Background", 2D) = "white" { }

        _GradientFront ("Gradient Front", 2D) = "black" { }
        _GradientBack ("Gradient Back", 2D) = "black" { }
        _LineworkMask ("Linework Mask", 2D) = "black" { }
        _HighlightMask ("Highlight Mask", 2D) = "black" { }
        _FrontTexture ("Front Texture", 2D) = "white" { }
        _BackTexture ("Back Texture", 2D) = "white" { }

        _NoiseFront ("Noise Front Gradient", 2D) = "black" { }
        _NoiseBack ("Noise Back Gradient", 2D) = "black" { }

        _FrontTexturePan ("Front Texture Pan", Vector) = (0, 0, 0, 0)
        _BackTexturePan ("Back Texture Pan", Vector) = (0, 0, 0, 0)
        _NoiseFrontPanSpeed ("Noise Front Pan Speed", Vector) = (0, 0, 0, 0)
        _NoiseBackPanSpeed ("Noise Back Pan Speed", Vector) = (0, 0, 0, 0)

        [Space(20)]
        _FrontGradientMod ("Front Grad Mod", Range(-1,1)) = 0
        _BackGradientMod ("Back Grad Mod", Range(-1,1)) = 0
        [Space(20)]
        _GradientFrontColor ("Front Color", Color) = (1, 1, 1, 1)
        _FrontEmission ("Front Emission", Float) = 0
        _GradientBackColor ("Back Color", Color) = (1, 1, 1, 1)
        _BackEmission ("Back Emission", Float) = 0
        _Color ("BackgroundColor", Color) = (1, 1, 1, 1)
        _BackgroundEmission ("Background Emission", Float) = 0
        _LineworkColor ("Linework Color", Color) = (1, 1, 1, 1)
        _LineworkEmission ("Linework Emission", Float) = 0
        _HighlightColor ("Highlight Color", Color) = (1, 1, 1, 1)
        _HighlightEmission ("Highlight Emission", Float) = 0
        [Space(20)]
        
        _BlendFront ("Front Soft-Hard", Range(0, 1)) = 1
        _BlendBack ("Back Soft-Hard", Range(0, 1)) = 1

        [Enum(Unlit, 0, Lit, 1)] _Lit ("Lighting", Int) = 0
    }
    
    SubShader 
  {
        LOD 100
        CGINCLUDE
        #pragma target 5.0
        ENDCG
        
        Cull Back
        ColorMask RGBA
        ZWrite On
        ZTest LEqual
        Offset 0, 0

        Pass
        {
            Tags { "LightMode" = "ForwardBase" }
            CGPROGRAM
            
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityPBSLighting.cginc"
            #include "UnityCG.cginc"
            

            struct appdata
            {
                float4 vertex: POSITION;
                float2 texcoord: TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };
            
            struct v2f
            {
                float4 pos: SV_POSITION;
                float2 uv: TEXCOORD0;
                
                UNITY_VERTEX_OUTPUT_STEREO
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            sampler2D _MainTex; float4 _MainTex_ST;
            sampler2D _GradientFront; float4 _GradientFront_ST;
            sampler2D _GradientBack; float4 _GradientBack_ST;
            sampler2D _LineworkMask; float4 _LineworkMask_ST;
            sampler2D _HighlightMask; float4 _HighlightMask_ST;
            sampler2D _NoiseFront; float4 _NoiseFront_ST;
            sampler2D _NoiseBack; float4 _NoiseBack_ST;
            sampler2D _FrontTexture; float4 _FrontTexture_ST;
            sampler2D _BackTexture; float4 _BackTexture_ST;
            float4 _FrontTexturePan;
            float4 _BackTexturePan;
            int _Lit;
            // Colors
            float4 _Color;
            float4 _GradientFrontColor, _GradientBackColor, _LineworkColor, _HighlightColor;
            float _BackgroundEmission, _FrontEmission, _BackEmission, _LineworkEmission, _HighlightEmission;
            float _FrontGradientMod;
            float _BackGradientMod;
            // Blending
            float _BlendBack, _BlendFront;
            // Motion
            float4 _NoiseFrontPanSpeed, _NoiseBackPanSpeed;

            v2f vert(appdata v)
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
                UNITY_TRANSFER_INSTANCE_ID(v, o);

                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = float4(v.texcoord.xy, 0, 0);
                return o;
            }
            
            fixed4 frag(v2f i): SV_Target
            {
                UNITY_SETUP_INSTANCE_ID(i);
                _FrontGradientMod = 1 - _FrontGradientMod;
                _BackGradientMod = 1 - _BackGradientMod;
                float4 background = tex2D(_MainTex, TRANSFORM_TEX(i.uv, _MainTex));
                float gradientFront = tex2D(_GradientFront, TRANSFORM_TEX(i.uv, _GradientFront));
                float gradientBack = tex2D(_GradientBack, TRANSFORM_TEX(i.uv, _GradientBack));
                float lineworkMask = tex2D(_LineworkMask, TRANSFORM_TEX(i.uv, _LineworkMask));
                float highlightMask = tex2D(_HighlightMask, TRANSFORM_TEX(i.uv, _HighlightMask));
                float4 frontTexture = tex2D(_FrontTexture, TRANSFORM_TEX(i.uv, _FrontTexture) + _FrontTexturePan * _Time.y);
                float4 backTexture = tex2D(_BackTexture, TRANSFORM_TEX(i.uv, _BackTexture) + _BackTexturePan * _Time.y);
                float noiseFront = tex2D(_NoiseFront, TRANSFORM_TEX(i.uv, _NoiseFront) + _Time.y * _NoiseFrontPanSpeed);
                float noiseBack = tex2D(_NoiseBack, TRANSFORM_TEX(i.uv, _NoiseBack) + _Time.y * _NoiseBackPanSpeed);
                
                float frontAlpha = gradientFront - (gradientFront * lerp(lerp(_FrontGradientMod - noiseFront, 0, gradientFront), (1 - step(_FrontGradientMod - gradientFront, noiseFront)), _BlendFront));
                float backAlpha = gradientBack - (gradientBack * lerp(lerp(_BackGradientMod - noiseBack, 0, gradientBack), (1 - step(_BackGradientMod - gradientBack, noiseBack)), _BlendBack));


                // Ambient Lighting
                float3 poiLighting = clamp(ShadeSH9(float4(0, 0, 0, 1)) + _LightColor0.rgb, 0, _LightColor0.a);
                
                fixed4 finalColor = float4(background.rgb * _Color, 1);
                finalColor = lerp(finalColor, _GradientBackColor * backTexture, backAlpha);
                finalColor = lerp(finalColor, _GradientFrontColor * frontTexture, frontAlpha);
                finalColor = lerp(finalColor, _LineworkColor, lineworkMask);
                finalColor = lerp(finalColor, _HighlightColor, highlightMask);
                
                finalColor.rgb *= lerp(1, poiLighting, _Lit);
                
                fixed4 emissionColor = float4(background.rgb * _Color * _BackgroundEmission, 1);
                emissionColor = lerp(emissionColor, _GradientBackColor * backTexture * _BackEmission, backAlpha);
                emissionColor = lerp(emissionColor, _GradientFrontColor * frontTexture * _FrontEmission, frontAlpha);
                emissionColor = lerp(emissionColor, _LineworkColor * _LineworkEmission, lineworkMask);
                emissionColor = lerp(emissionColor, _HighlightColor * _HighlightEmission, highlightMask);

                return finalColor + emissionColor;
            }
            ENDCG
            
        }
    }
}