Advertisement
Guest User

Underwater Light Rays (Unity)

a guest
Aug 19th, 2016
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. Shader "SweetRollStudio/Underwater"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _WaveStrength("WaveStrength", Float) = 1
  7. _WaveSpeed("WaveSpeed", Float) = 1
  8. _Power("Power", Range(0,1)) = 1
  9. }
  10. SubShader
  11. {
  12. // No culling or depth
  13. Cull Off ZWrite Off ZTest Always
  14.  
  15. Pass
  16. {
  17. CGPROGRAM
  18. #pragma vertex vert
  19. #pragma fragment frag
  20.  
  21. #include "UnityCG.cginc"
  22.  
  23. struct appdata
  24. {
  25. float4 vertex : POSITION;
  26. float2 uv : TEXCOORD0;
  27. };
  28.  
  29. struct v2f
  30. {
  31. float2 uv : TEXCOORD0;
  32. float4 vertex : SV_POSITION;
  33. };
  34.  
  35. v2f vert (appdata v)
  36. {
  37. v2f o;
  38. o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
  39. o.uv = v.uv;
  40. return o;
  41. }
  42.  
  43. sampler2D _MainTex;
  44. float _WaveStrength;
  45. float _WaveSpeed;
  46. float _Power;
  47.  
  48. float rayStrength(float2 raySource, float2 rayRefDirection, float2 coord, float seedA, float seedB, float speed)
  49. {
  50. float2 sourceToCoord = coord - raySource;
  51. float cosAngle = dot(normalize(sourceToCoord), rayRefDirection);
  52.  
  53. return clamp(
  54. (0.45 + 0.15 * sin(cosAngle * seedA + _Time.y * speed)) +
  55. (0.3 + 0.2 * cos(-cosAngle * seedB + _Time.y * speed)),
  56. 0.0, 1.0) * clamp((_ScreenParams.x - length(sourceToCoord)) / _ScreenParams.x, 0.5, 1.0);
  57. }
  58.  
  59. fixed4 frag (v2f i) : SV_Target
  60. {
  61. fixed4 main = tex2D(_MainTex, i.uv);
  62. if (_Power <= 0) {
  63. return main;
  64. }
  65. fixed4 ret;
  66. i.vertex.y *= -1;
  67. float2 uv = i.vertex.xy / _ScreenParams.xy;
  68. uv.y = 1.0 - uv.y;
  69. float2 coord = float2(i.vertex.x, _ScreenParams.y - i.vertex.y);
  70.  
  71. float2 rayPos1 = float2(_ScreenParams.x * 0.7, _ScreenParams.y * 0.4);
  72. float2 rayRefDir1 = normalize(float2(1.0, -0.116));
  73. float raySeedA1 = 36.2214;
  74. float raySeedB1 = 21.11349;
  75. float raySpeed1 = 1.5 * _WaveSpeed;
  76.  
  77. float2 rayPos2 = float2(_ScreenParams.x * 0.8, _ScreenParams.y * 0.6);
  78. float2 rayRefDir2 = normalize(float2(1.0, 0.241));
  79. const float raySeedA2 = 22.39910;
  80. const float raySeedB2 = 18.0234;
  81. const float raySpeed2 = 1.1 * _WaveSpeed;
  82.  
  83. float4 rays1 = float4(1.0, 1.0, 1.0, 1.0) * rayStrength(rayPos1, rayRefDir1, coord, raySeedA1, raySeedB1, raySpeed1) ;
  84.  
  85. float4 rays2 = float4(1.0, 1.0, 1.0, 1.0) * rayStrength(rayPos2, rayRefDir2, coord, raySeedA2, raySeedB2, raySpeed2);
  86.  
  87. ret = rays1 * 0.5 + rays2 * 0.4;
  88.  
  89. float brightness = (coord.y / _ScreenParams.y);
  90. ret.x = mul(ret.x, 0.1 + (brightness * 0.8));
  91. ret.y = mul(ret.x, 0.3 + (brightness * 0.6));
  92. ret.z = mul(ret.x, 0.5 + (brightness * 0.5));
  93.  
  94. ret = main * ret * _WaveStrength;
  95.  
  96. ret = lerp(main, ret, _Power);
  97.  
  98. return ret;
  99. }
  100. ENDCG
  101. }
  102. }
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement