Advertisement
Xibanya

Untitled

Aug 24th, 2019
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.86 KB | None | 0 0
  1. Shader "Xibanya/UI/HoloPolygon"
  2. {
  3.     Properties
  4.     {
  5.         [KeywordEnum(Circle,Spiral,Line,Triangle,Square,Pentagon)] _Polygon("Polygon", float) = 0
  6.         _Tex0("Circle", 2D) = "white" {}
  7.         [NoScaleOffset] _Tex1("Spiral", 2D) = "white" {}
  8.         [NoScaleOffset] _Tex2("Line", 2D) = "white" {}
  9.         [NoScaleOffset] _Tex3("Triangle", 2D) = "white" {}
  10.         [NoScaleOffset] _Tex4("Square", 2D) = "white" {}
  11.         [NoScaleOffset] _Tex5("Pentagon", 2D) = "white" {}
  12.         [NoScaleOffset] _Mask0("Circle Mask", 2D) = "white" {}
  13.         [NoScaleOffset] _Mask1("Spiral Mask", 2D) = "white" {}
  14.         [NoScaleOffset] _Mask2("Line Mask", 2D) = "white" {}
  15.         [NoScaleOffset] _Mask3("Triangle Mask", 2D) = "white" {}
  16.         [NoScaleOffset] _Mask4("Square Mask", 2D) = "white" {}
  17.         [NoScaleOffset] _Mask5("Pentagon Mask", 2D) = "white" {}
  18.         [Space]
  19.         [Header(Colors)]
  20.         [PerRendererData] [HDR] _Color("Tint", Color) = (1,1,1,1)
  21.         [HDR]_MColor1("Multiply Color 1", Color) = (1,1,1,1)
  22.         [HDR]_MColor2("Multiply Color 2", Color) = (1,1,1,1)
  23.         [HDR]_MColor3("Multiply Color 3", Color) = (1,1,1,1)
  24.         [Space]
  25.         [Header(Tracking Error)]
  26.         [Toggle] _TRACKING("Tracking Error", float) = 1
  27.         _InterlacingSeverity("Interlacing Severity", float) = 0.001
  28.         _InterlacingFrequency("Interlacing Frequency", float) = 1
  29.         _TrackingHeight("Tracking Height", float) = 0.15
  30.         _TrackingSeverity("Tracking Severity", float) = 0.025
  31.         _TrackingSpeed("Tracking Speed", float) = 0.2
  32.         [Space]
  33.         [Header(Glitch)]
  34.         [Toggle] _GLITCH("Glitch", float) = 1
  35.         _GlitchAlpha("Glitch Alpha", Range(0, 1)) = 0.5
  36.         _Width("Texture Width", float) = 2048
  37.         _Glitchiness("Glitchiness", Range(0, 1)) = 0
  38.         _GlitchSpeed("Glitch Speed", float) = 1
  39.         _Noise("Noise Texture", 2D) = "transparent" {}
  40.         _YSpeed("Y Speed", float) = 0.2
  41.         [Space]
  42.         [Header(RGB Mask)]
  43.         [Toggle] _RGBMASK("RGB Mask", int) = 0
  44.         _ShimmerSpeed("Shimmer Speed", float) = 30.0
  45.         _RGBMaskSize("RGB Mask Size", float) = 2.0
  46.         [Space]
  47.         [Header(Scanlines)]
  48.         [Toggle] _SCANLINES("Scanlines", int) = 1
  49.         _ScanlineCount("Scanline Count", int) = 800
  50.         _ScanlineSpeed("Scanline Move Speed", float) = 200.0
  51.         _ScanlineIntensity("Scanline Intensity", float) = 0.04
  52.         _ScanAlpha("Scanline Alpha", Range(0, 1)) = 1
  53.         [Space]
  54.         [Header(Render Options)]
  55.         [Toggle] _BILLBOARD("Billboard", float) = 1
  56.         [Enum(Off,0,Front,1,Back,2)] _Cull("Cull", float) = 0
  57.         [Enum(UnityEngine.Rendering.BlendMode)] _BlendOp("Blend Op", float) = 5
  58.         [Enum(UnityEngine.Rendering.BlendMode)] _BlendMode("Blend Mode", float) = 10
  59.     }
  60.         SubShader
  61.         {
  62.             Tags
  63.             {
  64.                 "RenderType" = "Transparent"
  65.                 "Queue" = "Transparent"
  66.                 "PreviewType" = "Plane"
  67.                 "CanUseSpriteAtlas" = "True"
  68.                 "IgnoreProjector" = "True"
  69.             }
  70.             Cull[_Cull]
  71.             ZWrite Off
  72.             LOD 100
  73.             Blend[_BlendOp][_BlendMode]
  74.  
  75.         Pass
  76.         {
  77.             Name "Glitch"
  78.             CGPROGRAM
  79.             #pragma vertex vert
  80.             #pragma fragment frag
  81.             #pragma multi_compile_local _POLYGON_CIRCLE _POLYGON_SPIRAL _POLYGON_LINE _POLYGON_TRIANGLE _POLYGON_SQUARE _POLYGON_PENTAGON
  82.             #pragma multi_compile_local __ _RGBMASK_ON
  83.             #pragma multi_compile_local __ _SCANLINES_ON
  84.             #pragma multi_compile_local __ _TRACKING_ON
  85.             #pragma multi_compile_local __ _GLITCH_ON
  86.             #pragma multi_compile_local __ _BILLBOARD_ON
  87.             #define mod(x,y) (x-y*floor(x/y))
  88.             #include "UnityCG.cginc"
  89.             #include "Assets/Scripts/Shaders/XibGlitch.cginc"
  90.  
  91.             sampler2D _Noise;
  92.             float4 _Noise_ST;
  93.  
  94.             struct appdata
  95.             {
  96.                 float4 vertex   : POSITION;
  97.                 float2 uv       : TEXCOORD0;
  98.                 float4 color    : COLOR;
  99.             };
  100.  
  101.             struct v2f
  102.             {
  103.                 float2 uv       : TEXCOORD0;
  104.                 float4 pos      : SV_POSITION;
  105.                 float4 posWorld : TEXCOORD1;
  106.                 float2 uv_Noise : TEXCOORD2;
  107.                 float3 normal   : TEXCOORD3;
  108.                 float4 color    : COLOR;
  109.             };
  110.  
  111.             Texture2D _Tex0;
  112.             SamplerState sampler_Tex0;
  113.             Texture2D _Tex1;
  114.             Texture2D _Mask1;
  115.             SamplerState SmpClampPoint;
  116.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Tex2);
  117.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Tex3);
  118.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Tex4);
  119.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Tex5);
  120.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Mask0);
  121.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Mask2);
  122.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Mask3);
  123.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Mask4);
  124.             UNITY_DECLARE_TEX2D_NOSAMPLER(_Mask5);
  125.             float4 _Tex0_ST, _Tex0_TexelSize;
  126.             half4 _Color;
  127.  
  128.             v2f vert(appdata v)
  129.             {
  130.                 v2f o;
  131. #if defined(_BILLBOARD_ON)
  132.                 //from https://github.com/unitycoder/DoomStyleBillboardTest/blob/master/Assets/Materials/Shaders/DoomSprite.shader
  133.                 o.normal = float3(0, 0, -1);
  134.                 float3 viewUpW = mul((float3x3)unity_CameraToWorld, float3(0, 1, 0));
  135.                 float3 viewRightW = mul((float3x3)unity_CameraToWorld, float3(1, 0, 0));
  136.                 float3 viewFrontW = mul((float3x3)unity_CameraToWorld, float3(0, 0, -_ProjectionParams.x));
  137.                 float3 vpos = mul((float3x3)unity_ObjectToWorld, v.vertex.xyz);
  138.                 float4 worldCoord = float4(unity_ObjectToWorld._m03, unity_ObjectToWorld._m13, unity_ObjectToWorld._m23, 1);
  139.                 float4 viewPos = mul(UNITY_MATRIX_V, worldCoord) + float4(vpos, 0);
  140.                 float4 outPos = mul(UNITY_MATRIX_P, viewPos);
  141.                 o.pos = UnityPixelSnap(outPos);
  142. #else
  143.                 o.pos = UnityObjectToClipPos(v.vertex);
  144. #endif
  145.                 o.uv = TRANSFORM_TEX(v.uv, _Tex0);
  146.                 o.posWorld = mul(unity_ObjectToWorld, v.vertex);
  147.                 o.uv_Noise = TRANSFORM_TEX(v.uv, _Noise);
  148.                 o.color = v.color * _Color;
  149.                 return o;
  150.             }
  151.             float _ShimmerSpeed;
  152.             float _RGBMaskSize;
  153.             half _InterlacingSeverity;
  154.             half _YSpeed;
  155.             half _GlitchSpeed;
  156.  
  157.             float _TrackingHeight;
  158.             float _TrackingSeverity;
  159.             float _TrackingSpeed;
  160.  
  161.             float _ScanlineCount;
  162.             float _ScanlineSpeed;
  163.             float _ScanlineIntensity;
  164.             float _ScanAlpha;
  165.             half4 _MColor1, _MColor2, _MColor3;
  166.  
  167.             half _Width;
  168.             half _Glitchiness, _GlitchAlpha, _InterlacingFrequency;
  169.  
  170.             half4 frag(v2f i) : SV_Target
  171.             {
  172.                 float2 uv = i.uv;
  173. #if defined (_TRACKING_ON)
  174.                 uv.x -= sin(uv.y * 500.0 * _InterlacingFrequency + _Time.y) * _InterlacingSeverity;
  175.                 float tracking = -_Time.y * _TrackingSpeed;
  176.                 float fractionalTime = (tracking - floor(tracking)) * 1.3 - _TrackingHeight;
  177.                 half useTrack = step(uv.y, fractionalTime + _TrackingHeight) * step(fractionalTime, uv.y);
  178.                 uv.x -= fractionalTime * _TrackingSeverity * useTrack;
  179. #endif
  180.                 half4 col;
  181.                 half4 mask;
  182. #if defined (_POLYGON_CIRCLE)
  183.                 col = _Tex0.Sample(sampler_Tex0, uv * _Tex0_ST.xy);
  184.                 mask = _Mask0.Sample(sampler_Tex0, uv * _Tex0_ST.xy);
  185. #elif defined (_POLYGON_SPIRAL)
  186.                 col = _Tex1.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  187.                 mask = _Mask1.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  188. #elif defined (_POLYGON_LINE)
  189.                 col = _Tex2.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  190.                 mask = _Mask2.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  191. #elif defined (_POLYGON_TRIANGLE)
  192.                 col = _Tex3.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  193.                 mask = _Mask3.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  194. #elif defined (_POLYGON_SQUARE)
  195.                 col = _Tex4.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  196.                 mask = _Mask4.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  197. #elif defined (_POLYGON_PENTAGON)
  198.                 col = _Tex5.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  199.                 mask = _Mask5.Sample(SmpClampPoint, uv * _Tex0_ST.xy);
  200. #endif
  201.                 col.rgb *= i.color.rgb;
  202.                 half3 white = half3(1, 1, 1);
  203.                 col.rgb *= lerp(white, lerp(col, _MColor1.rgb, _MColor1.a), mask.r);
  204.                 col.rgb *= lerp(white, lerp(col, _MColor2.rgb, _MColor2.a), mask.g);
  205.                 col.rgb *= lerp(white, lerp(col, _MColor3.rgb, _MColor3.a), mask.b);
  206.  
  207.                 half4 fragColor = col;
  208.  
  209. #ifdef _RGBMASK_ON
  210.                 float yOffset = floor(sin(_Time.y * _ShimmerSpeed));
  211.                 float pix = (i.posWorld.y + yOffset) * _Width + i.uv.x;
  212.                 pix = floor(pix);
  213.  
  214.                 float4 colMask = float4(mod(pix, _RGBMaskSize), mod((pix + 1.0), _RGBMaskSize), mod((pix + 2.0), _RGBMaskSize), 1.0);
  215.                 colMask = colMask / (_RGBMaskSize - 1.0) + 0.5;
  216.                 col.rgb = col.rgb * colMask.rgb;
  217. #endif
  218. #ifdef _GLITCH_ON
  219.                 float THRESHOLD = 0.1 + uv.x / _Width;
  220.                 float time_s = mod(_Time.y * _GlitchSpeed, 32.0);
  221.                 float glitch_threshold = 1.0 - THRESHOLD;
  222.                 const float max_ofs_siz = 0.1;
  223.                 const float yuv_threshold = 0.1; //in the original was 0.5, can also use _yuvThresh;
  224.                 const float time_frq = 16.0;
  225.                 uv.y = 1.0 - uv.y;
  226.                 const float min_change_frq = 4.0;
  227.                 float ct = mytrunc(time_s, min_change_frq);
  228.                 float change_rnd = rand(mytrunc(uv.yy, float2(16, 16)) + 150.0 * ct);
  229.  
  230.                 float tf = time_frq * change_rnd;
  231.  
  232.                 float t = 5.0 * mytrunc(time_s, tf);
  233.                 float vt_rnd = 0.5*rand(mytrunc(uv.yy + t, float2(11, 11)));
  234.                 vt_rnd += 0.5 * rand(mytrunc(uv.yy + t, float2(7, 7)));
  235.                 vt_rnd = vt_rnd * 2.0 - (1.0 - _Glitchiness);
  236.                 vt_rnd = sign(vt_rnd) * saturate((abs(vt_rnd) - glitch_threshold) / (1.0 - glitch_threshold));
  237.                 float2 uv_nm = uv;
  238.                 uv_nm = saturate(uv_nm + float2(max_ofs_siz*vt_rnd, 0));
  239.  
  240.                 float rnd = rand(float2(mytrunc(time_s, 8.0), mytrunc(time_s, 8.0)));
  241.                 uv_nm.y = (rnd > lerp(1.0, 0.975, saturate(THRESHOLD))) ? 1.0 - uv_nm.y : uv_nm.y;
  242.  
  243.                 float3 smpl_yuv = rgb2yuv(col.rgb);
  244.                 smpl_yuv.y /= 1.0 - 3.0*abs(vt_rnd) * saturate(yuv_threshold - vt_rnd);
  245.                 smpl_yuv.z += 0.125 * vt_rnd * saturate(vt_rnd - yuv_threshold);
  246.                 fragColor = float4(yuv2rgb(smpl_yuv), col.a);
  247.  
  248.                 fixed yScroll = _YSpeed * _Time.y;
  249.                 float2 uv_Noise = i.uv_Noise + float2(0, yScroll);
  250.                 fixed3 noise = tex2D(_Noise, uv_Noise).rgb;
  251.  
  252.                 int useGlitch = step(0.01, abs(col.rgb - fragColor.rgb));
  253.  
  254.                 fragColor.rgb = noise * fragColor.rgb * useGlitch + col.rgb * (1 - useGlitch);
  255.                 fragColor.a = _GlitchAlpha * col.a * useGlitch + col.a * (1 - useGlitch);
  256. #endif
  257.  
  258. #ifdef _SCANLINES_ON
  259.                 float scanlineYDelta = sin(_Time.y / _ScanlineSpeed);
  260.                 float scanline = sin((uv.y - scanlineYDelta) * _ScanlineCount) * _ScanlineIntensity;
  261.                 fragColor.rgb -= min(max(0, scanline), fragColor.rgb);
  262.                 fragColor.a -= min(max(0, scanline * (1 - _ScanAlpha)), fragColor.a);
  263. #endif
  264.                 return fragColor;
  265.             }
  266.             ENDCG
  267.         }
  268.         }
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement