// This shader draws a texture on the mesh. Shader "KernelPanic/glitch" { // The _BaseMap variable is visible in the Material's Inspector, as a field // called Base Map. Properties { [HDR] _BaseColor("Base Color", Color) = (1,1,1,1) [HDR] _NoiseColor("Noise Color", Color) = (1,1,1,1) [HDR] _GlitchColor("Glitch Color", Color) = (1,1,1,1) _BaseMap("Base Map", 2D) = "white" _NoiseMap1("Noise 1", 2D) = "black" _GlitchTex("Glitch Tex", 2D) = "black" [Range(0,1)] _Distortion("Distortion", Float) = 0 _Intensity("Intensity", Float) = 1 _TrailScatter("Trail Scatter", Float) = 0.02 _VertShake("Vertex Shake", Float) = 0.05 } SubShader { Tags { "RenderType" = "Opaque" "Queue" = "Geometry" "RenderPipeline" = "UniversalRenderPipeline" } Pass { Cull Off Zwrite On ZTest LEqual Blend SrcAlpha OneMinusSrcAlpha HLSLPROGRAM // #pragma target 5.0 // #pragma only_renderers d3d11 #pragma vertex vert #pragma fragment frag #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" #include "Assets/Shaders/random.cginc" struct Attributes { float4 positionOS : POSITION; // The uv variable contains the UV coordinate on the texture for the // given vertex. float2 uv : TEXCOORD0; half3 normal : NORMAL; }; struct Varyings { float4 positionHCS : SV_POSITION; // The uv variable contains the UV coordinate on the texture for the // given vertex. float2 uv : TEXCOORD0; half3 normal : NORMAL; float4 screenPos : TEXCOORD1; }; float _Distortion; float _Intensity; float _TrailScatter; float _VertShake; float4 _NoiseColor; float4 _BaseColor; float4 _GlitchColor; // This macro declares _BaseMap as a Texture2D object. TEXTURE2D(_BaseMap); TEXTURE2D(_NoiseMap1); TEXTURE2D(_GlitchTex); TEXTURE2D(_CameraDepthTexture); // This macro declares the sampler for the _BaseMap texture. SAMPLER(sampler_BaseMap); SAMPLER(sampler_NoiseMap1); SAMPLER(sampler_GlitchTex); SAMPLER(sampler_CameraDepthTexture); CBUFFER_START(UnityPerMaterial) // The following line declares the _BaseMap_ST variable, so that you // can use the _BaseMap variable in the fragment shader. The _ST // suffix is necessary for the tiling and offset function to work. float4 _BaseMap_ST; float4 _NoiseMap_ST; CBUFFER_END UNITY_INSTANCING_BUFFER_START(Props) UNITY_DEFINE_INSTANCED_PROP(float4, _Positions) UNITY_INSTANCING_BUFFER_END(Props) Varyings vert(Attributes IN) { Varyings OUT; OUT.normal = TransformObjectToWorldDir(IN.normal); // OUT.normal = IN.normal; float4 poscs = TransformObjectToHClip(IN.positionOS); float4 n = SAMPLE_TEXTURE2D_LOD(_NoiseMap1, sampler_NoiseMap1, hash42(poscs), 0); float3 pos = IN.positionOS + (n-0.5) * _VertShake; float4 p = UNITY_ACCESS_INSTANCED_PROP(Props, _Positions); float t = sin(p.y*_Time.w + p.x*6.28); float3 wpos = TransformObjectToWorld(pos); wpos += float3(0,t*p.z*0.1,0); pos = TransformWorldToObject(wpos); OUT.positionHCS = TransformObjectToHClip(pos); // The TRANSFORM_TEX macro performs the tiling and offset // transformation. OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap); OUT.screenPos = ComputeScreenPos(OUT.positionHCS); return OUT; } half4 frag(Varyings IN) : SV_Target { float2 suv = IN.screenPos.xy / IN.screenPos.w; float d = SAMPLE_TEXTURE2D(_CameraDepthTexture, sampler_CameraDepthTexture, suv); // float4 p = float4(.42069, .6969, .1337, .8008135); float4 p = UNITY_ACCESS_INSTANCED_PROP(Props, _Positions); float t = (p.x*sin(_Time.y)+p.w*cos(_Time.x)) * 0.5 + 0.5; // sample regular color float4 c = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, (IN.uv +lerp(p.xy,p.zw,0.2+0.6*t))*0.5); // c = lerp(c, _BaseColor, 0.5); float4 n = SAMPLE_TEXTURE2D(_NoiseMap1, sampler_NoiseMap1, (IN.uv +lerp(p.xy,p.zw,0.9-30*t))*19); n *= _NoiseColor; // sample blended glitch float4 g = SAMPLE_TEXTURE2D(_GlitchTex, sampler_GlitchTex, suv + _TrailScatter*n*hash42(IN.uv)); g *= _GlitchColor; // g = 1 - g; // sample color distorted by noise float distortion = _Distortion + (t-0.5) * _Intensity; float4 cd = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv + n * distortion * t); // float4 cn = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv + nuv * _GlitchColor); // c *= _BaseColor; // cn = lerp(cn,(1-cn),_Distortion); // cn += n; // float4 color = lerp(c, cn, n); // cheeky bit of top shading float un = dot(float3(0,1,0), IN.normal); // dot of up and normal c = lerp(c,_BaseColor,un*d); // color += (1-abs(un)) *_BaseColor; c = lerp(c, cd, g); c = min(c, float4(1, 1, 1, 1)); c += n; // c = lerp(n,c,0.5); // c = lerp(c, _BaseColor, _BaseColor.a); return c; } ENDHLSL } UsePass "Universal Render Pipeline/Lit/DepthOnly" } }