Shader "FX/Water (simple)" {
Properties {
_horizonColor ("Horizon color", COLOR) = ( .172 , .463 , .435 , 0)
_WaveScale ("Wave scale", Range (0.02,0.15)) = .07
_ColorControl ("Reflective color (RGB) fresnel (A) ", 2D) = "" { }
_ColorControlCube ("Reflective color cube (RGB) fresnel (A) ", Cube) = "" { TexGen CubeReflect }
_BumpMap ("Waves Normalmap ", 2D) = "" { }
_WaveSpeed ("Wave speed (map1 x,y; map2 x,y)", Vector) = (19,9,-16,-7)
_MainTex ("Fallback texture", 2D) = "" { }
}
CGINCLUDE
//
// This section is included in all program sections below
#include "UnityCG.cginc"
uniform float4 _horizonColor;
uniform float4 WaveSpeed;
uniform float _WaveScale;
uniform float4 _WaveOffset;
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f {
float4 pos : SV_POSITION;
float2 bumpuv[2] : TEXCOORD0;
float3 viewDir : TEXCOORD2;
};
v2f vert(appdata v)
{
v2f o;
float4 s;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
// scroll bump waves
float4 temp;
temp.xyzw = v.vertex.xzxz * _WaveScale / unity_Scale.w + _WaveOffset;
o.bumpuv[0] = temp.xy * float2(.4, .45);
o.bumpuv[1] = temp.wz;
// object space view direction
o.viewDir.xzy = normalize( ObjSpaceViewDir(v.vertex) );
return o;
}
ENDCG
//
// Fragment program
Subshader {
Tags { "RenderType"="Opaque" }
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
sampler2D _BumpMap;
sampler2D _ColorControl;
half4 frag( v2f i ) : COLOR
{
half3 bump1 = UnpackNormal(tex2D( _BumpMap, i.bumpuv[0] )).rgb;
half3 bump2 = UnpackNormal(tex2D( _BumpMap, i.bumpuv[1] )).rgb;
half3 bump = (bump1 + bump2) * 0.5;
half fresnel = dot( i.viewDir, bump );
half4 water = tex2D( _ColorControl, float2(fresnel,fresnel) );
half4 col;
col.rgb = lerp( water.rgb, _horizonColor.rgb, water.a );
col.a = _horizonColor.a;
return col;
}
ENDCG
}
}
//
// Old cards
// three texture, cubemaps
Subshader {
Tags { "RenderType"="Opaque" }
Pass {
Color (0.5,0.5,0.5,0.5)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture * primary
}
SetTexture [_MainTex] {
Matrix [_WaveMatrix2]
combine texture * primary + previous
}
SetTexture [_ColorControlCube] {
combine texture +- previous, primary
Matrix [_Reflection]
}
}
}
// dual texture, cubemaps
Subshader {
Tags { "RenderType"="Opaque" }
Pass {
Color (0.5,0.5,0.5,0.5)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture
}
SetTexture [_ColorControlCube] {
combine texture +- previous, primary
Matrix [_Reflection]
}
}
}
// single texture
Subshader {
Tags { "RenderType"="Opaque" }
Pass {
Color (0.5,0.5,0.5,0)
SetTexture [_MainTex] {
Matrix [_WaveMatrix]
combine texture, primary
}
}
}
}
Replies
http://www.shaderfusionblog.com/
The author is a member of this forum aswell (commanderKeen)
*edit: Well, you can use a static cubemap for reflections, but it might look more rubbish than not using one...
Yeah, I know that, I was kind of just thinking out loud there. All I really need is some transparency to the water. I just want to be able to see what's under the surface. The existing water with a bit of depth is idea.
this is EXACTLY what i'm trying to achieve. See how you can see the ice that's under the water, but anything deeper and it becomes opaque? The existing simple water shader with that ability would be ideal.
@commander_keen Whatever way it can be done in unity indie would be best for my situation anyways, because I want the water to be as cheap on taxing the system as possible. I see exactly what you're talking about, and if this were unreal or something, I might be able to do that, but the shader coding in unity isn't easy for someone like me, and my programmer has no experience with shaders. I guess I'd really need someone to sit down and talk me through it.
So I have the water now as a transparent object, but now i'm faced with 2 new problems. One is I need a fog of some sort underneath the water to add depth, and 2 for some reason, only one object can be seen under the water. Maybe the order the engine is drawing them in? Any way to change that?
Simple solution, I just created different tints of the seafloor texture and painted them according to the height of the terrain.
If you rip those out into your own shader, you should be able to fake a second fog effect somehow...
http://unity3d.com/support/documentation/Components/SL-CullAndDepth.html
http://unity3d.com/support/documentation/Components/SL-Blend.html
I've been able to run some post process in the indie version (bloom) just by exporting the package from the pro version, give it a try with your programmer you might be able to get the scene depth