Advertisement
annapuppet

GlitchWireframe.shader

Jul 8th, 2022
1,318
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement