|
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.
(comments are locked)
|
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.
Aug 06 '12 at 03:45 AM
rome58
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.
Aug 06 '12 at 05:26 PM
ScroodgeM
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!
Nov 19 '12 at 03:15 AM
erichavoc
(comments are locked)
|
