Advertisement
Guest User

Untitled

a guest
Jul 28th, 2015
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.78 KB | None | 0 0
  1. Shader "Mobile/Ocean" {
  2. Properties {
  3. _SurfaceColor ("SurfaceColor", Color) = (1,1,1,1)
  4. _WaterColor ("WaterColor", Color) = (1,1,1,1)
  5. _Refraction ("Refraction (RGB)", 2D) = "white" {}
  6. _Reflection ("Reflection (RGB)", 2D) = "white" {}
  7. _Bump ("Bump (RGB)", 2D) = "bump" {}
  8. _Foam ("Foam (RGB)", 2D) = "white" {}
  9. _Size ("Size", Vector) = (1, 1, 1, 1)
  10. _SunDir ("SunDir", Vector) = (0.3, -0.6, -1, 0)
  11. _WaveOffset ("Wave speed", Vector) = (19,9,-16,-7)
  12.  
  13. _SurfaceColorLod1 ("Surface Color LOD1", Color) = (1,1,1,0.5)
  14. _WaterColorLod1 ("Water Color LOD1", Color) = (1,1,1,0.5)
  15. _WaterTex ("Water LOD1 (RGB)", 2D) = "white" {}
  16. _WaterLod1Alpha ("Water Transparency", Range(0,1)) = 0.95
  17. }
  18. SubShader {
  19. Tags { "RenderType" = "Opaque" "Queue"="Geometry"}
  20. LOD 2
  21. Pass {
  22. CGPROGRAM
  23. #pragma vertex vert
  24. #pragma fragment frag
  25. #include "UnityCG.cginc"
  26.  
  27. struct v2f {
  28. half4 pos : SV_POSITION;
  29. half4 projTexCoord : TEXCOORD0;
  30. half4 bumpTexCoord : TEXCOORD1;
  31. float3 viewDir : TEXCOORD2;
  32. float3 objSpaceNormal : TEXCOORD3;
  33. float3 lightDir : TEXCOORD4;
  34. float2 foamStrengthAndDistance : TEXCOORD5;
  35. };
  36.  
  37. half4 _Size;
  38. half4 _SunDir;
  39. uniform half4 _WaveOffset;
  40.  
  41. v2f vert (appdata_tan v) {
  42. v2f o;
  43.  
  44. o.bumpTexCoord.xy = v.vertex.xz/float2(_Size.x, _Size.z)*5;
  45. o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
  46. o.foamStrengthAndDistance.x = v.tangent.w;
  47. o.foamStrengthAndDistance.y = clamp(o.pos.z, 0, 1.0);
  48.  
  49. half4 projSource = float4(v.vertex.x, 0.0, v.vertex.z, 1.0);
  50. half4 tmpProj = mul( UNITY_MATRIX_MVP, projSource);
  51. o.projTexCoord = tmpProj;
  52.  
  53. float3 objSpaceViewDir = ObjSpaceViewDir(v.vertex);
  54. float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) );
  55. float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );
  56.  
  57. o.objSpaceNormal = v.normal;
  58. o.viewDir = mul(rotation, objSpaceViewDir);
  59. o.lightDir = mul(rotation, float3(_SunDir.xyz));
  60.  
  61. return o;
  62. }
  63.  
  64. sampler2D _Refraction;
  65. sampler2D _Reflection;
  66. sampler2D _Bump;
  67. sampler2D _Foam;
  68. half4 _SurfaceColor;
  69. half4 _WaterColor;
  70.  
  71. half4 frag (v2f i) : COLOR {
  72. half3 normViewDir = normalize(i.viewDir);
  73. half4 buv = half4(i.bumpTexCoord.x + _WaveOffset.x * 0.05, i.bumpTexCoord.y + _WaveOffset.y * 0.03, i.bumpTexCoord.x + _WaveOffset.z * 0.04, i.bumpTexCoord.y - _WaveOffset.w * 0.02);
  74.  
  75. half3 tangentNormal0 = (tex2D(_Bump, buv.xy) * 2.0) - 1;
  76. half3 tangentNormal1 = (tex2D(_Bump, buv.zw) * 2.0) - 1;
  77. half3 tangentNormal = normalize(tangentNormal0 + tangentNormal1);
  78. float2 projTexCoord = 0.5 * i.projTexCoord.xy * float2(1, _ProjectionParams.x) / i.projTexCoord.w + float2(0.5, 0.5);
  79. half4 result = half4(0, 0, 0, 1);
  80. float2 bumpSampleOffset = i.objSpaceNormal.xz * 0.05 + tangentNormal.xy * 0.05;
  81.  
  82. half3 reflection = tex2D(_Reflection, projTexCoord.xy + bumpSampleOffset) * _SurfaceColor;
  83. half3 refraction = tex2D(_Refraction, projTexCoord.xy + bumpSampleOffset) * _WaterColor;
  84.  
  85. float fresnelLookup = dot(tangentNormal, normViewDir);
  86. float bias = 0.06;
  87. float power = 4.0;
  88. float fresnelTerm = bias + (1.0-bias)*pow(1.0 - fresnelLookup, power);
  89. float foamStrength = i.foamStrengthAndDistance.x * 1.8;
  90. half4 foam = clamp(tex2D(_Foam, i.bumpTexCoord.xy * 1.0) - 0.5, 0.0, 1.0) * foamStrength;
  91. float3 halfVec = normalize(normViewDir - normalize(i.lightDir));
  92. float specular = pow(max(dot(halfVec, tangentNormal.xyz), 0.0), 250.0);
  93.  
  94. result.rgb = lerp(refraction, reflection, fresnelTerm) + clamp(foam.r, 0.0, 1.0) + specular;
  95.  
  96. return result;
  97. }
  98. ENDCG
  99. }
  100. }
  101. SubShader {
  102. Tags { "Queue"="Transparent" "RenderType"="Transparent" }
  103. LOD 1
  104. Pass {
  105. Blend One OneMinusSrcAlpha
  106. CGPROGRAM
  107. #pragma vertex vert
  108. #pragma fragment frag
  109. #include "UnityCG.cginc"
  110.  
  111. struct v2f {
  112. float4 pos : SV_POSITION;
  113. float2 bumpTexCoord : TEXCOORD1;
  114. float3 viewDir : TEXCOORD2;
  115. float3 objSpaceNormal : TEXCOORD3;
  116. float3 lightDir : TEXCOORD4;
  117. float2 foamStrengthAndDistance : TEXCOORD5;
  118. };
  119.  
  120. half4 _Size;
  121. half4 _SunDir;
  122. sampler2D _WaterTex;
  123. uniform half4 _WaveOffset;
  124.  
  125. v2f vert (appdata_tan v) {
  126. v2f o;
  127.  
  128. o.bumpTexCoord.xy = v.vertex.xz/float2(_Size.x, _Size.z)*5;
  129. o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
  130. o.foamStrengthAndDistance.x = v.tangent.w;
  131. o.foamStrengthAndDistance.y = clamp(o.pos.z, 0, 1.0);
  132.  
  133. half4 projSource = float4(v.vertex.x, 0.0, v.vertex.z, 1.0);
  134. half4 tmpProj = mul( UNITY_MATRIX_MVP, projSource);
  135.  
  136. float3 objSpaceViewDir = ObjSpaceViewDir(v.vertex);
  137. float3 binormal = cross( normalize(v.normal), normalize(v.tangent.xyz) );
  138. float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );
  139.  
  140. o.objSpaceNormal = v.normal;
  141. o.viewDir = mul(rotation, objSpaceViewDir);
  142. o.lightDir = mul(rotation, float3(_SunDir.xyz));
  143.  
  144. return o;
  145. }
  146.  
  147. sampler2D _Bump;
  148. sampler2D _Foam;
  149. half4 _SurfaceColorLod1;
  150. half4 _WaterColorLod1;
  151. half _WaterLod1Alpha;
  152.  
  153. half4 frag (v2f i) : COLOR {
  154. half3 normViewDir = normalize(i.viewDir);
  155. half4 buv = half4(i.bumpTexCoord.x + _WaveOffset.x * 0.05, i.bumpTexCoord.y + _WaveOffset.y * 0.03, i.bumpTexCoord.x + _WaveOffset.z * 0.04, i.bumpTexCoord.y - _WaveOffset.w * 0.02);
  156. half2 buv2 = half2(i.bumpTexCoord.x - _WaveOffset.z * 0.05, i.bumpTexCoord.y - _WaveOffset.w * 0.05);
  157.  
  158. half3 tangentNormal0 = (tex2D(_Bump, buv.xy) * 2.0) - 1;
  159. half3 tangentNormal1 = (tex2D(_Bump, buv.zw) * 2.0) - 1;
  160. half3 tangentNormal = normalize(tangentNormal0 + tangentNormal1);
  161.  
  162. half4 result = half4(0, 0, 0, 1);
  163. half3 tex = tex2D(_WaterTex, buv2*2) * _WaterColorLod1;
  164.  
  165. float fresnelLookup = dot(tangentNormal, normViewDir);
  166. float bias = 0.06;
  167. float power = 4.0;
  168. float fresnelTerm = bias + (1.0-bias)*pow(1.0 - fresnelLookup, power);
  169. float foamStrength = i.foamStrengthAndDistance.x * 1.8;
  170. half4 foam = clamp(tex2D(_Foam, i.bumpTexCoord.xy * 1.0) - 0.5, 0.0, 1.0) * foamStrength;
  171. float3 halfVec = normalize(normViewDir - normalize(i.lightDir));
  172. float specular = pow(max(dot(halfVec, tangentNormal.xyz), 0.0), 250.0);
  173.  
  174. result.a = _WaterLod1Alpha;
  175. result.rgb = lerp(tex, _SurfaceColorLod1, fresnelTerm) + clamp(foam.r, 0.0, 1.0) + specular;
  176.  
  177. return result;
  178. }
  179. ENDCG
  180. }
  181. }
  182. FallBack "Diffuse", 1
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement