hi there
I found this hlsl .fx water shader somewhere on my hard disk. Since I’m no expert when it comes to shaders, I thought I’ll post here and ask
Is the shader any good? Would it be worth converting it to Unity’s shaderlab?
static float max_water_dist = 3000;
const float f = 10000.0;
const float n = 1.0;
static float max_water_depth = 80;
texture tMAIN;
texture tMAIN2;
texture tMAIN3;
texture tMAIN4;
texture tBUMP;
matrix mWorld : WORLD;
matrix mID : VIEWPROJECTION;
matrix mView : VIEW;
matrix mViewProj : WORLDVIEWPROJECTION;
float4 cAmbient;
float4 fog;
matrix texturePr;
float4 matBump;
float4 matBump2;
float4 cMat;
float4 LightDir;
float4 CamPos;
struct VS_OUT
{
float4 Position : POSITION;
float4 Diffuse : COLOR;
float4 TexCoord : TEXCOORD0;
float4 TexCoord2 : TEXCOORD1;
float4 TexCoord3 : TEXCOORD2;
float4 TexCoord4 : TEXCOORD3;
};
struct VS_INPUT
{
float4 Pos : POSITION;
float3 Normal : NORMAL;
float2 Tex0 : TEXCOORD0;
};
sampler MainSamp3 = sampler_state
{
texture = <tMAIN>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
sampler MainSamp = sampler_state
{
texture = <tMAIN>;
AddressU = MIRROR;
AddressV = MIRROR;
AddressW = MIRROR;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
sampler MainSamp2 = sampler_state
{
texture = <tMAIN2>;
AddressU = MIRROR;
AddressV = MIRROR;
AddressW = MIRROR;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
sampler MainSamp6 = sampler_state
{
texture = <tMAIN3>;
AddressU = MIRROR;
AddressV = MIRROR;
AddressW = MIRROR;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
sampler MainSamp7 = sampler_state
{
texture = <tMAIN4>;
AddressU = MIRROR;
AddressV = MIRROR;
AddressW = MIRROR;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
sampler BumpSamp = sampler_state
{
texture = <tBUMP>;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
MIPFILTER = LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
VS_OUT VS
(VS_INPUT i)
{
VS_OUT Out = (VS_OUT)0;
float4 Pos = mul(i.Pos, mWorld);
Out.Position = mul(Pos, mID);
float4 Pos2 = Out.Position;
Pos2.xy = Pos2.xy*0.5f;//-0.5f;
Out.TexCoord3.xy = Out.Position.zw;
Out.TexCoord = Pos2;
Out.TexCoord2.xy = Pos.xz*0.004f+float2(100,100);
Out.TexCoord2.z = clamp(Out.Position.z/fog.y,0,1);
Out.TexCoord2.w = Out.Position.w;
Out.TexCoord4 = Pos;
return Out;
}
void PS(VS_OUT In,
out float4 Color : COLOR
)
{
float4 Color2;
float2 texEnv = In.TexCoord.xy/In.TexCoord.w-0.5f;
float2 texEnv2;
float2 texEnv3;
texEnv.y = -texEnv.y;
texEnv.x = texEnv.x-1.0f;
float2 tex1 = In.TexCoord2.xy;
float range = In.TexCoord2.z;
float2 bumpT;
bumpT.x = tex1.x*matBump.x + tex1.y*matBump.y;
bumpT.y = tex1.x*matBump.z + tex1.y*matBump.a;
float2 bumpT2;
bumpT2.x = tex1.x*matBump2.x + tex1.y*matBump2.y;
bumpT2.y = tex1.x*matBump2.z + tex1.y*matBump2.a;
float4 bump2 = 2*(tex2D(BumpSamp, bumpT.xy)-0.5f);
float4 bump3 = 2*(tex2D(BumpSamp, bumpT2.xy)-0.5f);
bump2 = lerp(bump2,bump3,0.5f);
texEnv3.x = texEnv.x+bump2.x*3.f;
texEnv3.y = texEnv.y+bump2.y*3.f;
float4 ground_depth = tex2D( MainSamp6, texEnv.xy );
ground_depth.r = (ground_depth.r*0.125f + ground_depth.g);
float water_depth = min( max_water_dist, abs( 1/( In.TexCoord3.x/In.TexCoord3.y - 1 ) ) )/max_water_dist;
//if (water_depth>0.9f) water_depth = 0;
float result_depth = clamp(( ground_depth.r-water_depth )*max_water_dist/max_water_depth ,0,1);
texEnv2 = texEnv+bump2*(result_depth);
Color = tex2D(MainSamp, texEnv3.xy);
Color.rgb = Color.rgb*0.2f+cAmbient.rgb*0.8f;
Color2 = tex2D(MainSamp2, texEnv2.xy);
float4 Color3 = tex2D(MainSamp7, tex1.xy*20.f);
Color2 = Color2 + Color3*(1-result_depth)*0.1f;
float3 fCam = normalize(In.TexCoord4.xyz-CamPos.xyz);
float3 lL = normalize(-float3(LightDir.x,-LightDir.y,LightDir.z));
float n_dot_l = saturate(dot(lL,(bump2.xzy*2.f))+0.7f);
float bbb = bump2.xzy*4.f;
float3 vRe = normalize( 2 * dot( fCam, bbb ) * bbb - fCam);
float fRdotL = saturate( dot( vRe, lL ));
float specular = clamp( pow( fRdotL, 20 )*0.2f,0,1)*0.8f;
Color.rgb = Color.rgb*n_dot_l + specular;
Color.rgb = lerp(Color2.rgb,Color.rgb,result_depth*clamp(range*30,0,1));//*0.8f + cAmbient.rgb*0.2f;
Color.a = 1;
}
float4 PS_UW(VS_OUT In) : COLOR
{
float4 Color;
float4 Color2;
float2 texEnv = In.TexCoord.xy/In.TexCoord.w-0.5f;
float2 texEnv2;
float2 texEnv3;
texEnv.y = -texEnv.y;
texEnv.x = texEnv.x-1.0f;
float2 tex1 = In.TexCoord2.xy;
float range = In.TexCoord2.z;
float2 bumpT;
bumpT.x = tex1.x*matBump.x + tex1.y*matBump.y;
bumpT.y = tex1.x*matBump.z + tex1.y*matBump.a;
float2 bumpT2;
bumpT2.x = tex1.x*matBump2.x + tex1.y*matBump2.y;
bumpT2.y = tex1.x*matBump2.z + tex1.y*matBump2.a;
float4 bump2 = 2*(tex2D(BumpSamp, bumpT.xy)-0.5f);
float4 bump3 = 2*(tex2D(BumpSamp, bumpT2.xy)-0.5f);
bump2 = bump2*bump3;
texEnv2.x = texEnv.x+bump2.x*5.31f;
texEnv2.y = texEnv.y-bump2.y*5.31f;
texEnv3.x = texEnv.x+bump2.x*5.31f;
texEnv3.y = texEnv.y-bump2.y*5.31f;
Color2 = tex2D(MainSamp2, texEnv3.xy);
Color2.rgb = lerp(Color2.rgb,cAmbient.rgb*0.2f,0.8f)+clamp(bump2.y*10.f,0,1);
Color.rgb = lerp(Color2.rgb,cAmbient.rgb,range);
Color.a = 1;
return Color;
}
VS_OUT VS2
(VS_INPUT i)
{
VS_OUT Out = (VS_OUT)0;
float4 Pos = mul(i.Pos, mWorld);
Out.Position = mul(Pos, mID);
Out.TexCoord.xy = i.Tex0.xy*1000;
Out.TexCoord2.z = clamp(Out.Position.z/fog.y,0,1);
return Out;
}
float4 PS_CAUST(VS_OUT In) : COLOR
{
float4 Color;
float range = In.TexCoord2.z;
Color = tex2D(MainSamp3, In.TexCoord.xy);
Color.a = Color.r*0.2f*(1-range*2.f);
return Color;
}
technique T0
{
pass P0
{
VertexShader = compile vs_1_1 VS();
PixelShader = compile ps_3_0 PS();
FogEnable = False;
Lighting = False;
SpecularEnable = False;
ZWriteEnable = True;
}
}
technique T1
{
pass P0
{
VertexShader = compile vs_1_1 VS();
PixelShader = compile ps_2_0 PS_UW();
CullMode = CW;
FogEnable = False;
Lighting = False;
SpecularEnable = False;
ZWriteEnable = True;
}
}
technique T2
{
pass P0
{
VertexShader = compile vs_1_1 VS2();
PixelShader = compile ps_2_0 PS_CAUST();
FogEnable = False;
Lighting = False;
SpecularEnable = False;
ZWriteEnable = False;
ZEnable = False;
}
}
Thanks