SHOW:
|
|
- or go back to the newest paste.
1 | Shader "Custom/GlitchWireframeEffect" | |
2 | { | |
3 | Properties | |
4 | { | |
5 | [Header(Vertex Displacement)] | |
6 | _Intensity ("Vertex Intensity", Range(0,1)) = 0.3 | |
7 | _Width("Pulse Width", Range(0,1)) = 0.5 | |
8 | _PulseFreq("Pulse Freq", Range(0,1)) = 0.2 | |
9 | _Scale("Pulse Scale", Range(0,5)) = 2 | |
10 | _Speed("Speed", Range(-5,5)) = 0.3 | |
11 | _Random("Random Offset", Range(0,5)) = 0.0 | |
12 | ||
13 | [Header(Tinting)] | |
14 | _TintingBrightness("Tinting Brightness", Range(0,5)) = 1.0 | |
15 | _Stretch("Stretch Tinting Gradient", Range(0,5)) = 2 | |
16 | _Tinting("Albedo Tinting", Color) = (0,0,1,1) | |
17 | _Tinting2("Albedo Tinting 2", Color) = (0,0,0,1) | |
18 | ||
19 | [Header(Backfaces)] | |
20 | _Brightness ("Backface Brightness", Range(0,5)) = 4 | |
21 | _BackfaceCol ("Backface Color", Color) = (0,0.5,1,1) | |
22 | _BackfaceCol2 ("Backface Color2", Color) = (0,1,1,1) | |
23 | _StretchBackface("Stretch BackFace Gradient", Range(0,5)) = 0.0 | |
24 | ||
25 | [Header(Rim)] | |
26 | _RimBrightness("Rim Brightness", Range(0,20)) = 5 | |
27 | _RimPower("RImPOwer", Range(0,20)) = 10 | |
28 | _StretchRim("Stretch Rim Gradient", Range(0,5)) = 2 | |
29 | _RimCol ("Rim Color", Color) = (1,0,1,1) | |
30 | _RimCol2 ("Rim Color 2", Color) = (1,1,1,1) | |
31 | ||
32 | [Header(Other)] | |
33 | _Clipping("Front Face Clipping", Range(0,1)) = 0.0 | |
34 | _Distortion("Distortion", Range(0,1)) = 0.2 | |
35 | } | |
36 | SubShader | |
37 | { | |
38 | Tags { "RenderType"="Opaque" "Queue"="Geometry+2"} | |
39 | LOD 200 | |
40 | Cull Off | |
41 | GrabPass { "_GrabTex" } | |
42 | CGPROGRAM | |
43 | #include "UnityCG.cginc" | |
44 | ||
45 | ||
46 | // Physically based Standard lighting model, and enable shadows on all light types | |
47 | #pragma surface surf Simple vertex:vert addshadow | |
48 | ||
49 | // Use shader model 3.0 target, to get nicer looking lighting | |
50 | #pragma target 4.0 | |
51 | ||
52 | ||
53 | sampler2D _GrabTex; | |
54 | float4 _GrabTex_TexelSize; | |
55 | ||
56 | ||
57 | #pragma lighting Simple exclude_path:prepass | |
58 | inline half4 LightingSimple(SurfaceOutput s, half3 lightDir, half atten) | |
59 | { | |
60 | half4 c; | |
61 | c.rgb = s.Albedo * _LightColor0.rgb *atten; | |
62 | c.a = s.Alpha; | |
63 | return c; | |
64 | } | |
65 | ||
66 | struct Input | |
67 | { | |
68 | float4 screenPos; | |
69 | float facing : VFACE; | |
70 | float3 viewDir; | |
71 | float3 worldPos; | |
72 | float glitchPosFront; | |
73 | float glitchPos; | |
74 | }; | |
75 | ||
76 | fixed4 _BackfaceCol2, _BackfaceCol; | |
77 | fixed4 _Tinting, _Tinting2; | |
78 | fixed4 _RimCol,_RimCol2; | |
79 | float _Intensity,_Width, _PulseFreq; | |
80 | float _Stretch, _StretchBackface, _StretchRim; | |
81 | float _Random,_Scale,_Speed; | |
82 | float _Brightness,_TintingBrightness,_RimBrightness; | |
83 | float _RimPower; | |
84 | sampler2D _CameraDepthTexture; | |
85 | float _Distortion; | |
86 | float _Clipping; | |
87 | ||
88 | float rand(float n) | |
89 | { | |
90 | return frac(sin(n) * 43758.5453123); | |
91 | } | |
92 | ||
93 | ||
94 | ||
95 | void vert (inout appdata_full v, out Input o) | |
96 | { | |
97 | UNITY_INITIALIZE_OUTPUT (Input, o); | |
98 | ||
99 | // vertex y position, with optional randomness | |
100 | float randomPos = (rand(v.texcoord.x) * _Random ) + (v.vertex.y * _Scale); | |
101 | float moveSpeed = _Time.y * _Speed; | |
102 | ||
103 | // repeat position on model, and move it up/down | |
104 | float glitchPos = frac((randomPos +moveSpeed ) * _PulseFreq) ;// position on model | |
105 | ||
106 | // clamp the width with a smoothstep | |
107 | float glitchPosClamped = smoothstep(glitchPos , glitchPos + 1, _Width ); | |
108 | ||
109 | // only split on the camera viewing part | |
110 | float3 viewDir = normalize(ObjSpaceViewDir(v.vertex)); | |
111 | float frontFacing =saturate(dot(normalize(v.normal), normalize(viewDir))) ; | |
112 | frontFacing = step(0.1, frontFacing); | |
113 | ||
114 | // move vertices outward based on the glitchy position | |
115 | v.vertex.xyz += (glitchPosClamped * normalize(v.normal)) * _Intensity * frontFacing; | |
116 | ||
117 | // send positions through to the fragment function | |
118 | o.glitchPos = glitchPos; | |
119 | o.glitchPosFront = glitchPosClamped* frontFacing; | |
120 | } | |
121 | ||
122 | // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. | |
123 | // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. | |
124 | // #pragma instancing_options assumeuniformscaling | |
125 | UNITY_INSTANCING_BUFFER_START(Props) | |
126 | // put more per-instance properties here | |
127 | UNITY_INSTANCING_BUFFER_END(Props) | |
128 | ||
129 | float3 GetFaceNormal(float3 position) { | |
130 | float3 dx = ddx(position); | |
131 | float3 dy = ddy(position); | |
132 | return normalize(cross(dy, dx)); | |
133 | } | |
134 | ||
135 | void surf (Input IN, inout SurfaceOutput o) | |
136 | { | |
137 | // grabtex uv | |
138 | float2 uv = IN.screenPos.xy / IN.screenPos.w; | |
139 | ||
140 | // get an evened out facenormal, will make the distortions move more with the vertex movement | |
141 | float3 faceNormal = GetFaceNormal(IN.worldPos.xyz); | |
142 | ||
143 | // distorted uv | |
144 | float2 distortedUV = lerp(uv, (faceNormal + uv) * 0.5, _Distortion) ; | |
145 | // grabtex | |
146 | float4 grabPassTex = tex2D (_GrabTex, distortedUV ); | |
147 | ||
148 | //base albedo is the grabtex | |
149 | o.Albedo = grabPassTex.rgb ; | |
150 | ||
151 | // backfaces colors, lerped over glitchpos | |
152 | float3 backGlitchCol = lerp(_BackfaceCol2, _BackfaceCol, saturate(IN.glitchPos* _StretchBackface)); | |
153 | ||
154 | // tinted grabtex colors, lerped over glitchpos | |
155 | float3 albedoTinting = lerp( _Tinting, _Tinting2,saturate(IN.glitchPos* _Stretch)); | |
156 | albedoTinting *= grabPassTex.rgb; | |
157 | // add tinting | |
158 | o.Albedo += (albedoTinting * _TintingBrightness) ; | |
159 | ||
160 | // use vface to only add color to the front faces | |
161 | o.Albedo = (IN.facing>0) ? o.Albedo : 0; | |
162 | ||
163 | // create a rim | |
164 | float Rim = 1.0 - saturate(dot(normalize(faceNormal), normalize(IN.viewDir))); | |
165 | float softRim = pow(Rim, _RimPower) ; | |
166 | ||
167 | ||
168 | // color rim based on glitchpos | |
169 | float3 rimCol = lerp(_RimCol, _RimCol2, saturate(IN.glitchPos * _StretchRim) ); | |
170 | ||
171 | // rimcol on frontfacing, backglithcol on backfacing | |
172 | o.Emission = ((IN.facing>0) ? ( rimCol * _RimBrightness) * softRim: backGlitchCol * _Brightness ) ; | |
173 | ||
174 | // clip front to show into the mesh more | |
175 | clip( ((1-IN.glitchPosFront)- _Clipping)); | |
176 | ||
177 | o.Alpha = 1; | |
178 | } | |
179 | ENDCG | |
180 | } | |
181 | FallBack "Diffuse" | |
182 | } | |
183 |