Sinuousity

WaterShaderNoShadows.shader

Oct 3rd, 2014
540
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. Shader "Natural/Water"
  2. {
  3.     Properties
  4.     {
  5.         _WaterCol ("Water Color",Color) = (0.3,0.3,1.0,1.0)
  6.        
  7.         _Storm ("Storminess",Range(0.01,1.0)) = 0.5
  8.         _WaveHeight ("Wave Height",Range(0.0,1.2)) = 1.0
  9.         _WaveSpeed ("Ripple Speed",Range(0.0001,0.02)) = 0.01
  10.        
  11.         _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0)
  12.        
  13.         _BumpMap ("Wave Bump", 2D) = "bump" {}
  14.         _BumpScale ("Wave Scales", Vector) = (1.0,2.0,3.0,4.0)
  15.        
  16.         _Cube ("Cubemap", CUBE) = "" {}
  17.     }
  18.     SubShader
  19.     {
  20.         Tags
  21.         {
  22.             "RenderType" = "Opaque"
  23.             "Queue" = "Transparent"
  24.         }
  25.         CGPROGRAM
  26.         #pragma surface surf Custom alpha
  27.         #pragma target 3.0
  28.         #include "UnityCG.cginc"
  29.        
  30.         struct Input
  31.         {
  32.             half waveAmount;
  33.             float3 viewDir;
  34.             float3 worldPos;
  35.             float3 worldRefl;
  36.             INTERNAL_DATA
  37.         };
  38.        
  39.         uniform float4 S_CameraDirection;
  40.         sampler2D _BumpMap;
  41.         samplerCUBE _Cube;
  42.         half _Shininess,_Storm,_BumpStrength,_WaveHeight,_WaveSpeed;
  43.         fixed4 _BumpScale;
  44.         fixed4 _WaterCol;
  45.        
  46.         //Custom Lighting
  47.         inline fixed4 LightingCustom (SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
  48.         {
  49.             fixed diff = max (0, dot (s.Normal, lightDir)*0.5+0.5);
  50.            
  51.             half3 halfVector = normalize (lightDir + viewDir);
  52.             float halfDot = saturate (dot (s.Normal, halfVector)*lerp(1.001,1.006,_Storm));
  53.             float spec = pow (halfDot, s.Specular*128.0) * s.Gloss;
  54.            
  55.             fixed4 c;
  56.             c.rgb = (s.Albedo * _LightColor0.rgb * diff + _LightColor0.rgb * _SpecColor.rgb * spec) * (atten * 2);
  57.             c.a = s.Alpha + _LightColor0.a * _SpecColor.a * spec * atten;
  58.             return c;
  59.         }
  60.        
  61.         //Surface
  62.         void surf (Input IN, inout SurfaceOutput o)
  63.         {
  64.             float3 rgb2lum = float3(0.30,0.59,0.11);
  65.             float camDist = distance(_WorldSpaceCameraPos,IN.worldPos);
  66.             float distMod = (1.0-saturate((camDist-100.0)*0.001));
  67.             float3 wp = IN.worldPos.xyz;
  68.            
  69.             float waveAmount;
  70.             float pi = 3.14159265359;
  71.             float pi2 = pi*2.0;
  72.             float waveFreq = 0.4*_Storm;
  73.             float waveLength = _Storm;
  74.             float waveFreqRads = pi2*waveFreq;
  75.             float waveNumber = pi2/waveLength;
  76.             waveAmount = sin (waveNumber*wp.x*0.01 - waveFreqRads*_Time.y*0.5)-sin (waveNumber*wp.x*0.005 - waveFreqRads*_Time.y*0.5);
  77.             waveAmount = waveAmount*_Storm;
  78.            
  79.             float2 offset = ParallaxOffset (waveAmount, _WaveHeight*_Storm, IN.viewDir)*distMod*4.0;
  80.            
  81.             float2 wwp = float2(IN.worldPos.x + offset.x,IN.worldPos.z + offset.y);
  82.             float2 bumpUvs = float2(wwp.x,wwp.y);
  83.            
  84.             half time = _Time.y*lerp(_WaveSpeed*0.5,_WaveSpeed,_Storm);
  85.            
  86.             float4 bump1 = tex2D (_BumpMap, bumpUvs/_BumpScale.x+time);
  87.             float4 bump2 = tex2D (_BumpMap, bumpUvs/_BumpScale.y+time);
  88.             float4 bump3 = tex2D (_BumpMap, bumpUvs/_BumpScale.z+time);
  89.             float4 bump4 = tex2D (_BumpMap, bumpUvs/_BumpScale.w+time);
  90.            
  91.             float4 bump = bump1+bump2+bump3+bump4;
  92.             bump *= 0.25;
  93.            
  94.             float3 normals = UnpackNormal(bump);
  95.             normals = lerp(float3(0.0,0.0,1.0),normals,lerp(0.02,0.80,_Storm));
  96.            
  97.             o.Alpha = lerp(0.4,0.9,(camDist-2.0)*0.014);
  98.             o.Gloss = _WaterCol.a;
  99.             o.Normal = normalize(normals);
  100.            
  101.             float3 worldRefl = WorldReflectionVector (IN, o.Normal);
  102.             fixed4 reflcol = texCUBE (_Cube, worldRefl);
  103.            
  104.             half rim = saturate(dot (normalize(IN.viewDir), o.Normal));
  105.            
  106.             o.Specular = pow(2.0,5.0-_Storm*3.0);
  107.             o.Albedo = lerp(_WaterCol*1.5,_WaterCol,_Storm);
  108.             half refPow = lerp(0.5,2.0,_Storm);
  109.             o.Albedo = lerp (o.Albedo,reflcol.rgb*0.5,pow(1.0-rim,refPow)+pow(rim,refPow)*0.6);
  110.         }
  111.         ENDCG
  112.     }
  113.     Fallback "Diffuse"
  114. }
Advertisement
Add Comment
Please, Sign In to add comment