water shader fx

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 :wink:
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

yes, it would - wish I knew how though =-(