{"id":1056,"date":"2012-09-05T14:43:50","date_gmt":"2012-09-05T11:43:50","guid":{"rendered":"http:\/\/unitycoder.com\/blog\/?p=1056"},"modified":"2014-06-15T03:04:55","modified_gmt":"2014-06-15T00:04:55","slug":"water-shader-test-from-minecraft-plugin","status":"publish","type":"post","link":"https:\/\/unitycoder.com\/blog\/2012\/09\/05\/water-shader-test-from-minecraft-plugin\/","title":{"rendered":"Water Shader Test (from minecraft plugin)"},"content":{"rendered":"<p><a title=\"start webplayer demo\" href=\"http:\/\/unitycoder.com\/upload\/demos\/minecraftwatershaderpluginUnity1\/\" target=\"_blank\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1057\" data-permalink=\"https:\/\/unitycoder.com\/blog\/2012\/09\/05\/water-shader-test-from-minecraft-plugin\/minecraft_plugin_water_test1\/\" data-orig-file=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/09\/minecraft_plugin_water_test1.jpg?fit=680%2C402&amp;ssl=1\" data-orig-size=\"680,402\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}\" data-image-title=\"minecraft_plugin_water_test1\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/09\/minecraft_plugin_water_test1.jpg?fit=300%2C177&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/09\/minecraft_plugin_water_test1.jpg?fit=680%2C402&amp;ssl=1\" class=\"alignnone size-full wp-image-1057\" title=\"minecraft_plugin_water_test1\" src=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/09\/minecraft_plugin_water_test1.jpg?resize=680%2C402\" alt=\"\" width=\"680\" height=\"402\" srcset=\"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/09\/minecraft_plugin_water_test1.jpg?w=680&amp;ssl=1 680w, https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/09\/minecraft_plugin_water_test1.jpg?resize=300%2C177&amp;ssl=1 300w\" sizes=\"auto, (max-width: 680px) 100vw, 680px\" \/><\/a><\/p>\n<p>Tried to convert one <a title=\"http:\/\/www.minecraftforum.net\/topic\/542215-125-water-shader-alpha-v5b\/\" href=\"http:\/\/www.minecraftforum.net\/topic\/542215-125-water-shader-alpha-v5b\/\" target=\"_blank\">minecraft water shader<\/a> to Unity.. some bugs left, as it doesnt really look that nice? (although havent seen the original in action..)<\/p>\n<p><strong>Webplayer:<\/strong><br \/>\n<a title=\"start webplayer demo\" href=\"http:\/\/unitycoder.com\/upload\/demos\/minecraftwatershaderpluginUnity1\/\" target=\"_blank\">http:\/\/unitycoder.com\/upload\/demos\/minecraftwatershaderpluginUnity1\/<\/a><\/p>\n<p><strong>Shader source:<\/strong><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\r\n\/\/ original source: http:\/\/www.minecraftforum.net\/topic\/542215-125-water-shader-alpha-v5b\/\r\n\/\/ unity version: http:\/\/unitycoder.com\/blog\/2012\/09\/05\/water-shader-test-from-minecraft-plugin\/\r\n\r\nShader &quot;UnityCoder\/minecraftWater&quot; {\r\nProperties {\r\n\/\/\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0_MainTex (&quot;_MainTex&quot;, 2D) = &quot;white&quot; {}\r\ncolorMap (&quot;colorMap&quot;, 2D) = &quot;white&quot; {}\r\nreflectedColorMap (&quot;reflectedColorMap&quot;, 2D) = &quot;white&quot; {}\r\nstencilMap (&quot;stencilMap&quot;, 2D) = &quot;white&quot; {}\r\n\r\n\/\/\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0timer (&quot;timer &quot;, Float) = 0\r\nwater_dist (&quot;water_dist&quot;, Float) = 0\r\nwater_color (&quot;water_color&quot;, Color) = (0,0.1,0.5,1)\r\nsurface_effects (&quot;surface_effects&quot;, Float) = 0\r\n\r\n}\r\nSubShader {\r\nTags { &quot;RenderType&quot;=&quot;Opaque&quot; }\r\nLOD 200\r\n\r\nCGPROGRAM\r\n\/\/\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0#define PI 3.141592653589793238462643383279\r\n#pragma target 3.0\r\n#pragma surface surf Lambert\r\n\/\/#include &quot;UnityCG.cginc&quot;\r\n\r\n\r\nfloat PI = 3.14159265358979323846;\r\n\r\nuniform float water_dist;\r\n\/\/uniform float timer;\r\n\/\/uniform sampler2D _MainTex;\r\nuniform sampler2D colorMap;\r\nuniform sampler2D reflectedColorMap;\r\nuniform sampler2D stencilMap;\r\nuniform float3 water_color;\r\nuniform float surface_effects;\r\n\/\/varying float4 texcoord;\r\n\/\/float4 texcoord;\r\n\r\n\/*\r\nconst int gaussRadius = 11;\r\nconst float gaussFilter&#x5B;gaussRadius] = float&#x5B;gaussRadius](\r\n0.0402,0.0623,0.0877,0.1120,0.1297,0.1362,0.1297,0.1120,0.0877,0.0623,0.0402\r\n);\r\n*\/\r\n\r\nstruct Input {\r\n\/\/float2 uv_MainTex;\r\nfloat2 uvcolorMap;\r\n};\r\n\r\nvoid surf (Input IN, inout SurfaceOutput o)\r\n{\r\n\r\n\/\/float3 water_color = float3(0.0, 0.4, 0.2); \/\/0.22,0.2 (now uniform through config)\r\nfloat in_water; \/\/&#039;boolean&#039;\r\n\r\nfloat4 color;\r\n\/\/float4 stencil = tex2D(stencilMap,texcoord.rg);\r\nfloat4 stencil = tex2D(stencilMap,IN.uvcolorMap.rg);\r\n\r\nif (stencil.r &gt; 0.05) in_water = 1.0;\r\nelse in_water = 0.0;\r\n\r\n\/\/distortion begin\r\nfloat x_scale = 1.0;\r\nfloat z_scale = 1.0;\r\n\r\nfloat timer = _Time.x;\r\n\r\n\/\/float used_timer = timer;\r\nfloat used_timer = timer*2;\r\n\r\nfloat time_scale = 2.0; \/\/2.0\r\nfloat size_scale = 1.6*6.3; \/\/also dependent on radius\r\n\r\nif (stencil.r &lt;= 0.15) {\r\nsize_scale *= 6.0;\r\ntime_scale *= 1.5;\r\n} else {\r\nsize_scale *= stencil.r;\r\n}\r\n\r\n\/\/timer needs to be &#039;in period&#039;\r\nif (stencil.r &gt;= 0.5) { \/\/\r\nx_scale = ( 0.995 + (sin(2.0*time_scale*3.14159*used_timer - sin(0.5*size_scale*3.14159*stencil.g) + (size_scale*3.14159*stencil.g))\/100.0)); \/\/scales btw 0.995 and 1.005\r\n} \/\/- sin(0.5*size_scale*3.14159*stencil.b)\r\nz_scale = ( 0.995 + (sin(sin(time_scale*3.14159*used_timer)\u00a0 + 1.5*sin(0.8*size_scale*3.14159*stencil.b))\/150.0));\r\n\r\n\/\/float2 disturbed = float2(x_scale*texcoord.x, z_scale*texcoord.y);\r\nfloat2 disturbed = float2(x_scale*IN.uvcolorMap.x, z_scale*IN.uvcolorMap.y);\r\n\r\nfloat4 reflection = tex2D(reflectedColorMap,disturbed.rg);\r\n\/\/if (x_scale + z_scale &gt; 2.00099) reflection *= 1.8; \/\/to monitor effects...!\r\n\r\ntime_scale = 3.0; \/\/2.0\r\nsize_scale = 2.4*6.3 * stencil.r;\r\n\r\n\/\/timer needs to be &#039;in period&#039;\r\nif (stencil.r &gt;= 0.5) { \/\/- sin(0.25*size_scale*3.14159*stencil.g)\r\nx_scale = ( 0.995 + (sin(2.0*time_scale*3.14159*used_timer - sin(0.25*size_scale*3.14159*stencil.g) + size_scale*3.14159*stencil.g)\/100.0)); \/\/scales btw 0.995 and 1.005\r\n}\r\nz_scale = ( 0.995 + (sin(sin(time_scale*3.14159*used_timer) + 1.5*sin(size_scale*3.14159*stencil.b))\/100.0));\r\n\/\/float2 disturbed_2 = float2(x_scale*texcoord.x, z_scale*texcoord.y);\r\nfloat2 disturbed_2 = float2(x_scale*IN.uvcolorMap.x, z_scale*IN.uvcolorMap.y);\r\n\/\/distortion end\r\n\r\nfloat4 reflection_2 = tex2D(reflectedColorMap,disturbed_2.rg);\r\n\r\n\r\nreflection = (reflection+reflection_2)\/2.0;\r\n\r\n\r\n\/\/float look_up_range = 0.008; \/\/0.005 \/\/0.008\r\nfloat look_up_range = 0.008; \/\/0.005 \/\/0.008\r\n\r\nfloat r1 = tex2D(stencilMap,float2(disturbed.r + look_up_range, disturbed.g + look_up_range)).r;\r\nfloat r2 = tex2D(stencilMap,float2(disturbed.r - look_up_range, disturbed.g - look_up_range)).r;\r\nfloat r3= tex2D(stencilMap,float2(disturbed.r, disturbed.g)).r;\r\n\r\n\/\/float4 c1= tex2D(colorMap,disturbed.rg);\r\nfloat4 c1= tex2D(colorMap,disturbed.rg);\r\nfloat4 c2= tex2D(colorMap,IN.uvcolorMap);\r\n\/\/float4 c2= tex2D(colorMap,texcoord.rg);\r\nfloat4 c3= tex2D(colorMap,IN.uvcolorMap);\r\n\/\/float4 c3= tex2D(colorMap,texcoord.rg);\r\n\r\n\r\n\/*\r\n\/\/&#039;refraction&#039;(for all under-water)\r\nif (in_water &gt; 0.05)\r\n{\r\n\/\/costs performance! (masking to avoid outside water look-ups, alternative another scene clipping)\r\nif ( r1&gt; 0.001 &amp;&amp;\r\nr2 &gt; 0.001 &amp;&amp;\r\nr3 &gt; 0.001) {\r\ncolor =c1; \/\/drunken effect without stencil if\r\n} else {\r\ncolor = c2;\r\n}\r\n} else {\r\ncolor = c3;\r\n}*\/\r\ncolor = c1; \/\/ c1 = all\r\n\r\n\/\/combine reflection and scene at water surfaces\r\n\/\/modify reflection in distance?\r\nfloat reflection_strength = 0.3 * (stencil.r-0.1); \/\/0.4, 0.55, 0.1, 0.14, 0.16, 0.17, 0.5\r\nfloat disable_refl = stencil.r-0.1;\r\n\r\nif (disable_refl &lt;= 0.0) disable_refl = 0.0; \/\/no reflection\r\n\r\n\/\/times inverted color.r for a stronger reflection in darker water parts!\r\n\/\/used to be 8.0, 6.0, 3.5\r\nfloat3 reflection_color = float3(1.0, 1.0, 1.0);\r\nreflection_color =\u00a0 reflection_strength * disable_refl * reflection.rgb;\/\/ * reflection.rgb * in_water * (1.0-(color.r*color.g*color.b));\r\n\r\n\/\/more color in darker water in relation to the reflection\r\n\/\/color darkened\r\nfloat difference = (reflection_color.r+reflection_color.g+reflection_color.b)\/3.0 - (color.r + color.g + color.b)\/5.5; \/\/5.5\r\nif (difference &lt; 0.0) difference = 0.0;\r\nfloat3 regular_color = color.rgb * (1.0-in_water*reflection_strength) + (in_water * (difference * water_color));\r\n\r\n\/\/if (surface_effects &gt; 0.0) { \/\/ oma\r\n\r\n\/\/&quot;waves&quot;\r\nfloat t = 3.0*(PI*0.1*timer)+12.0;\r\nfloat u = (1.1*stencil.g);\r\nfloat v = (1.1*stencil.b);\r\n\r\n\/\/water &quot;height&quot; bumps\r\n\/\/sin(PI*t*v) -&gt; also for size of the &quot;bumps&quot;\r\n\/\/20.0*t -&gt; &quot;speed&quot;\r\nfloat rsx = (sin( 0.9*sin(PI*t*v) + 0.7*sin(PI*t*v) + 18.1*PI*stencil.g) + sin( t*t + sin(PI*t*v*u) + 26.3*PI*stencil.g))*0.05;\r\nfloat rsz = (sin( 0.6*sin(PI*t*u) + 0.8*sin(PI*t*u) + 16.4*PI*stencil.b) + sin( t*t + sin(PI*t*u+u) + 32.2*PI*stencil.b))*0.05;\r\n\r\nrsx += 0.15;\r\nrsz += 0.15;\r\n\r\nfloat fresn = clamp(4.0\/water_dist,0.0,1.0);\r\n\r\nrsx = clamp(rsx, 0.0, 1.0);\r\nrsz = clamp(rsz, 0.0, 1.0);\r\n\r\n\/\/sinc filter (alternative, not used yet)\r\n\r\nfloat tm = (timer\/550.0)+0.255; \/\/0.45 0.26 0.28\r\nif (tm &gt; 0.28) tm = 0.28-(timer\/55.0); \/\/HMM\r\n\r\n\/\/float tm = 0.45;\r\n\r\nfloat pow3 = (tm+rsx+rsz)*(tm+rsx+rsz)*(tm+rsx+rsz);\r\nrsx *= (1.6 + 0.7*sin(16.6*(tm+rsx+rsz))\/pow3);\r\nrsz *= (1.3 + 0.7*sin(16.1*(tm+rsx+rsz))\/pow3);\r\n\r\nrsx = 1.0-rsx;\r\nrsz = 1.0-rsz;\r\n\r\n\/\/surface color increase\r\nif (rsx + rsz &gt; 1.9 &amp;&amp; rsx + rsz &lt; 1.999) {\r\nrsx *= 1.05;\r\nrsz *= 1.05;\r\nif (rsx + rsz &gt; 1.999) {\r\nrsx *= 1.07;\r\nrsz *= 1.07;\r\nif (rsx + rsz &gt; 1.9993) {\r\nrsx *= 1.1;\r\nrsz *= 1.1;\r\n}\r\n}\r\n}\r\n\r\nfloat increase = rsx + rsz;\r\n\/\/1.9 -&gt; 1, 1.999 (~2) -&gt; 1.2\r\n\/\/first scale 1-1.2 to 0-1\r\nfloat mult = 5.0;\r\nfloat max = 1.15;\r\nincrease = mult * (increase - 0.9);\r\nif (increase &gt; mult*max) increase = 0.0;\r\nincrease = clamp(increase, 1.0, 2.0);\r\n\r\nrsx *= increase;\r\nrsz *= increase;\r\n\r\nif (increase &gt; 1) rsx = 100;\r\n\r\nrsx = 1.0-rsx;\r\nrsz = 1.0-rsz;\r\n\r\nreflection_color *= float3(0.6, 0.95, 0.95);\r\nreflection_color *= 0.8;\r\nreflection_color = 1.1*reflection_color +\r\nfresn * (1.0-reflection_strength) *\r\n(reflection_color*1.5*rsx + reflection_color*1.5*rsz);\r\n\r\nfloat count = 1.0;\r\n\/\/for (int i=-3; i&lt;3; i++)\r\nfor (int i=0; i&lt;6; i++)\r\n{\r\nfloat2 uv = disturbed.rg;\r\nuv.y += 0.007 * (i-3);\r\n\r\n\r\nfloat3 col = tex2D(reflectedColorMap,uv).xyz;\r\nif (reflection_color.r &lt; 0.01) col = float3(0.0);\r\n\r\nfloat str = (col.x + col.y + col.z) \/ 3.0;\r\nstr = str * str - 0.2;\r\n\r\nif (col.x + col.y + col.z &gt; 2.3) {\r\nreflection_color += clamp((str * col), 0.0, 3.0);\/\/ * float3(1.0, 0.0, 0.0);\r\ncount ++;\r\n}\r\n\/\/} \/\/ oma\r\n\r\nreflection_color \/= 6;\r\n\r\n\/\/if (count &gt; 1) reflection_color.rgb = float3(1.0, 0.0, 0.0);\r\n\r\n}\r\n\r\nfloat4 out_color = float4(regular_color, 1.0) + float4(reflection_color, 1.0);\r\n\r\n\/\/TEST\r\n\/\/float3 add = float3(0.0, 0.0, 0.0);\r\n\r\n\/\/if (\u00a0\u00a0\u00a0 stencil.x &gt; 0.1) {\r\n\r\n\/\/float2 uShift = float2(0.005, 0.0);\r\n\r\n\/\/float2 texCoord = texcoord.xy - float(int(gaussRadius\/2)) * uShift;\r\n\r\n\/\/for (int i=0; i&lt;gaussRadius; ++i) {\r\n\/\/\u00a0\u00a0\u00a0 add += gaussFilter&amp;#91;i&amp;#93; * tex2D(colorMap, texCoord).xyz;\r\n\/\/\u00a0\u00a0\u00a0 texCoord += uShift;\r\n\/\/}\r\n\r\n\/\/uShift = float2(0.0, 0.007);\r\n\r\n\/\/texCoord = texcoord.xy - float(int(gaussRadius\/2)) * uShift;\r\n\/\/for (int i=0; i&lt;gaussRadius; ++i) {\r\n\/\/\u00a0\u00a0 add += gaussFilter&amp;#91;i&amp;#93; * tex2D(colorMap, texCoord).xyz;\r\n\/\/\u00a0\u00a0\u00a0 texCoord += uShift;\r\n\/\/}\r\n\r\n\/\/}\r\n\/\/TEST END\r\n\r\n\/\/gl_FragColor = out_color;\/\/ * float4(1.5, 1.3, 1.0, 1.0);\r\n\r\n\/\/gl_FragColor -= 2.0*float4(0.1, 0.05, 0.0, 1.0);\r\n\/\/gl_FragColor += 1.2*float4(1.5, 1.3, 0.8,1.0)*float4(add,1.0);\r\n\r\n\/\/debug section\r\n\/\/gl_FragColor = tex2D(colorMap,texcoord.rg);\r\n\/\/gl_FragColor = stencil;\r\n\/\/gl_FragColor = float4(float3(stencil.r), 1.0);\r\n\/\/gl_FragColor = tex2D(reflectedColorMap,texcoord.rg);\r\n\r\n\/\/if (rsx &gt; 0.28) gl_FragColor = float4(1.0, 0.0, 0.0, 1.0);\r\n\r\n\r\n\/\/half4 c = half4(0,0,0,0); \/\/tex2D (_MainTex, IN.uv_MainTex);\r\n\/\/o.Albedo = tex2D (_MainTex, IN.uvcolorMap).rgb; \/\/out_color.rgb;\r\no.Albedo = out_color.rgb;\r\n\/\/o.Albedo = stencil;\r\no.Alpha = 1; \/\/out_color.a;\r\n}\r\nENDCG\r\n}\r\nFallBack &quot;Diffuse&quot;\r\n}\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Tried to convert one minecraft water shader to Unity.. some bugs left, as it doesnt really look that nice? (although havent seen the original in action..) Webplayer: http:\/\/unitycoder.com\/upload\/demos\/minecraftwatershaderpluginUnity1\/ Shader source: \/\/ original source: http:\/\/www.minecraftforum.net\/topic\/542215-125-water-shader-alpha-v5b\/ \/\/ unity version: http:\/\/unitycoder.com\/blog\/2012\/09\/05\/water-shader-test-from-minecraft-plugin\/ Shader &quot;UnityCoder\/minecraftWater&quot; { Properties { \/\/\u00a0\u00a0 \u00a0\u00a0\u00a0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1057,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[4,3],"tags":[144,47,14,259,60],"class_list":["post-1056","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-demos","category-unity3d","tag-minecraft","tag-sea","tag-shader","tag-surface","tag-water"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/unitycoder.com\/blog\/wp-content\/uploads\/2012\/09\/minecraft_plugin_water_test1.jpg?fit=680%2C402&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p1KTaT-h2","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts\/1056","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/comments?post=1056"}],"version-history":[{"count":5,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts\/1056\/revisions"}],"predecessor-version":[{"id":3010,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/posts\/1056\/revisions\/3010"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/media\/1057"}],"wp:attachment":[{"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/media?parent=1056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/categories?post=1056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/unitycoder.com\/blog\/wp-json\/wp\/v2\/tags?post=1056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}