- Home /
adding a vertex alpha to simple water for mobile
Hi, i'm not really much of a coder, i'm looking to add vertex alpha to the simple water shader that ships with unity. Anyone know of a way to do that? The texture and color alpha's already being used by the shader to generate the reflection, so it would seem the best option left is vertex alpha.
`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
}
}
}
}
`
Answer by ScroodgeM · Aug 04, 2012 at 12:36 PM
Shader "FX/Water (simple) with vertA" { 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; fixed4 color : COLOR; };
struct v2f { float4 pos : SV_POSITION; float2 bumpuv[2] : TEXCOORD0; float3 viewDir : TEXCOORD2; fixed4 color : COLOR; };
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) );
o.color = v.color;
return o; }
ENDCG
// ----------------------------------------------------------- // Fragment program
Subshader { Tags { "RenderType"="Transparent" } Pass {
Blend SrcAlpha OneMinusSrcAlpha ZWrite Off
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 = i.color.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 } } }
}
Thanks for the quick response. I tried out the shader, but now the shader is making the water plane completely transparent, even with the vert alpha turned to 100% visibility. I don't know if i could be missing something. thanks for helping out.
make sure your Horizon color's alpha value is not zero too
by default alpha value was taken from Horizon color only, so i saved this possibility, multiplied it to vertex's color. of course, if Horizon color alpha is zero, result color is zero too.
nice. i have a problem with that. my character don't receive the blur effect of the water. can you fix that? i will very thx!
Your answer
Follow this Question
Related Questions
Unity3 (Free) Simple water jumps back periodically 0 Answers
A node in a childnode? 1 Answer
simple water alpha 1 Answer
Simple Water Alpha 0 Answers
Simple Sprint? 2 Answers