Advertisement
Guest User

CausticsProjector.shader

a guest
Jan 12th, 2019
4,937
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.73 KB | None | 0 0
  1. Shader "Projector/Caustic" {
  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. fixed4 triplanar(float3 blendNormal, float4 texturex, float4 texturey, float4 texturez)
  58. {
  59. float4 triplanartexture = texturez;
  60. triplanartexture = lerp(triplanartexture, texturex, blendNormal.x);
  61. triplanartexture = lerp(triplanartexture, texturey, blendNormal.y);
  62. return triplanartexture;
  63. }
  64.  
  65. fixed4 frag(v2f i) : SV_Target
  66. {
  67. float speed = _Time.x * _Speed;
  68. float3 blendNormal = saturate(pow(i.worldNormal * 1.4,4));
  69.  
  70. // distortion
  71. float4 distortx = tex2D(_Noise, float2(i.worldPos.zy * _NoiseScale) - (speed));
  72. float4 distorty = tex2D(_Noise, float2(i.worldPos.xz * _NoiseScale) -(speed));
  73. float4 distortz = tex2D(_Noise, float2(i.worldPos.xy * _NoiseScale) - (speed));
  74.  
  75. float distort = triplanar(blendNormal, distortx , distorty, distortz);
  76.  
  77. // moving caustics
  78. float4 xc = tex2D(_Tile, float2((i.worldPos.z +distort) * _Scale, (i.worldPos.y) * (_Scale/4)));
  79. float4 zc = tex2D(_Tile, float2((i.worldPos.x +distort) * _Scale, (i.worldPos.y ) * (_Scale/4)));
  80. float4 yc = tex2D(_Tile, (float2(i.worldPos.x + distort, i.worldPos.z + distort) )* _Scale );
  81.  
  82. float4 causticsTex = triplanar(blendNormal, xc , yc, zc);
  83.  
  84. // secondary moving caustics, smaller scale and moving opposite direction
  85. float secScale = _Scale * 0.6;
  86. float4 xc2 = tex2D(_Tile, float2((i.worldPos.z -distort) * secScale, (i.worldPos.y ) * (secScale/4)));
  87. float4 zc2 = tex2D(_Tile, float2((i.worldPos.x -distort) * secScale, (i.worldPos.y ) * (secScale/4)));
  88. float4 yc2 = tex2D(_Tile, float2(i.worldPos.x - distort, i.worldPos.z - distort)* secScale);
  89.  
  90. float4 causticsTex2 = triplanar(blendNormal, xc2, yc2, zc2);
  91.  
  92. // combining
  93. causticsTex *= causticsTex2;
  94. causticsTex *= _Intensity * _ColorT;
  95.  
  96. // alpha
  97. float falloff = tex2Dproj(_FalloffTex, UNITY_PROJ_COORD(i.uvFalloff)).a;
  98. float alphaMask = tex2Dproj(_Mask, UNITY_PROJ_COORD(i.uvMask)).a;
  99. float alpha = falloff * alphaMask;
  100.  
  101. // texture and color times alpha
  102. _Color *= alpha * _Color.a;
  103. causticsTex *= alpha;
  104.  
  105. return causticsTex + _Color;
  106. }
  107. ENDCG
  108. }
  109. }
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement