Guest User

CausticsInteractive.shader

a guest
Jan 25th, 2019
2,576
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Projector/Caustics Interactive" {
  2.     Properties{
  3.         _Color("Main Color", Color) = (0,0,1,0.7)
  4.         _ColorT("Tint", Color) = (0,1,1,0.6)
  5.         _Mask("Mask", 2D) = "" {}
  6.         _Noise("Noise", 2D) = "black" {}   
  7.         _Tile("Tile", 2D) = "" {}  
  8.         _FalloffTex("FallOff", 2D) = "white" {}
  9.         _Scale("Scale", Range(0,1)) = 0.1
  10.         _Speed("Speed", Range(0,10)) = 1
  11.         _Intensity("Intensity", Range(0,10)) = 5
  12.         _NoiseScale("Noise Scale", Range(0,1)) = 0.1
  13.         [Enum(UnityEngine.Rendering.BlendMode)] _BlendOp ("Blend Op", Int) = 5
  14.         [Enum(UnityEngine.Rendering.BlendMode)] _BlendMode ("Blend Mode", Int) = 10
  15.     }
  16.  
  17.     Subshader{
  18.         Tags {"Queue" = "Transparent"}
  19.         Pass {
  20.             ZWrite Off
  21.             Cull Off
  22.             ColorMask RGB
  23.             Blend [_BlendOp] [_BlendMode]
  24.             Offset -1, -1
  25.  
  26.             CGPROGRAM
  27.             #pragma vertex vert
  28.             #pragma fragment frag  
  29.             #include "UnityCG.cginc"
  30.  
  31.             struct v2f {
  32.                 float4 uvMask : TEXCOORD0;
  33.                 float4 pos : SV_POSITION;
  34.                 float4 uvFalloff : TEXCOORD1;
  35.                 float3 worldPos : TEXCOORD2;
  36.                 float3 worldNormal : TEXCOORD3;                
  37.                 };
  38.  
  39.             float4x4 unity_Projector;
  40.             float4x4 unity_ProjectorClip;
  41.            
  42.             v2f vert(appdata_full v)
  43.             {
  44.                 v2f o;                             
  45.                 o.uvFalloff = mul(unity_ProjectorClip, v.vertex);
  46.                 o.pos = UnityObjectToClipPos(v.vertex);
  47.                 o.uvMask = mul(unity_Projector, v.vertex);
  48.                 o.worldPos = mul(unity_ObjectToWorld, v.vertex);
  49.                 o.worldNormal = normalize(mul(float4(v.normal, 0.0), unity_ObjectToWorld).xyz);
  50.                 return o;
  51.             }
  52.  
  53.             float4 _Color, _ColorT;
  54.             sampler2D _Tile, _Mask, _FalloffTex, _Noise;
  55.             float _Scale, _Intensity, _Speed, _NoiseScale;
  56.  
  57.             uniform sampler2D _GlobalEffectRT;
  58.             uniform float3 _Position;
  59.             uniform float _OrthographicCamSize;
  60.            
  61.             fixed4 triplanar(float3 blendNormal, float4 texturex, float4 texturey, float4 texturez)
  62.             {                  
  63.                 float4 triplanartexture = texturez;
  64.                 triplanartexture = lerp(triplanartexture, texturex, blendNormal.x);
  65.                 triplanartexture = lerp(triplanartexture, texturey, blendNormal.y);
  66.                 return triplanartexture;
  67.             }
  68.  
  69.             fixed4 frag(v2f i) : SV_Target
  70.             {
  71.  
  72.                
  73.                 float2 uv = i.worldPos.xz - _Position.xz;
  74.                 uv = uv/(_OrthographicCamSize *2);
  75.                 uv += 0.5;
  76.                 float4 effect = tex2D(_GlobalEffectRT, float2 (uv.x, uv.y) );
  77.                 float4 efMask = tex2D(_Mask, uv);
  78.                    
  79.                 effect *= efMask.a;
  80.  
  81.                 float speed = _Time.x * _Speed;
  82.                 float3 blendNormal = saturate(pow(i.worldNormal * 1.4,4));
  83.  
  84.                 // distortion
  85.                 float4 distortx = tex2D(_Noise, float2(i.worldPos.zy * _NoiseScale) - (speed));
  86.                 float4 distorty = tex2D(_Noise, float2(i.worldPos.xz * _NoiseScale)  -(speed));
  87.                 float4 distortz = tex2D(_Noise, float2(i.worldPos.xy * _NoiseScale)  - (speed));
  88.                    
  89.                 float distort = triplanar(blendNormal, distortx + (effect.b * 4) , distorty + (effect.b * 4), distortz +(effect.b * 4));
  90.                    
  91.                 // moving caustics
  92.                 float4 xc = tex2D(_Tile, float2((i.worldPos.z +distort) * _Scale, (i.worldPos.y) * (_Scale/4)));
  93.                 float4 zc = tex2D(_Tile, float2((i.worldPos.x +distort) * _Scale, (i.worldPos.y ) * (_Scale/4)));
  94.                 float4 yc = tex2D(_Tile, (float2(i.worldPos.x + distort, i.worldPos.z + distort) )* _Scale );
  95.  
  96.                 float4 causticsTex = triplanar(blendNormal, xc , yc, zc);
  97.                    
  98.                 // secondary moving caustics, smaller scale and moving opposite direction
  99.                 float secScale = _Scale * 0.6;
  100.                 float4 xc2 = tex2D(_Tile, float2((i.worldPos.z -distort) * secScale, (i.worldPos.y ) * (secScale/4)));
  101.                 float4 zc2 = tex2D(_Tile, float2((i.worldPos.x -distort) * secScale, (i.worldPos.y ) * (secScale/4)));
  102.                 float4 yc2 = tex2D(_Tile, float2(i.worldPos.x - distort, i.worldPos.z - distort)* secScale);
  103.  
  104.                 float4 causticsTex2 = triplanar(blendNormal, xc2+ effect.b, yc2 + effect.b, zc2+ effect.b);
  105.                    
  106.                 // combining
  107.                 causticsTex *= causticsTex2;
  108.                 causticsTex *= _Intensity * _ColorT;
  109.                    
  110.                 // alpha
  111.                 float falloff = tex2Dproj(_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff)).a;
  112.                 float alphaMask = tex2Dproj(_Mask, UNITY_PROJ_COORD(i.uvMask)).a;
  113.                 float alpha = falloff * alphaMask;
  114.  
  115.                 // texture and color times alpha
  116.                 _Color *= alpha * _Color.a;
  117.                 causticsTex *= alpha;
  118.  
  119.                 return saturate(causticsTex + _Color);
  120.             }
  121.             ENDCG
  122.         }
  123.     }
  124. }
RAW Paste Data