I've found these ocean water shader on the Net. Maybe someone can make work with A6.
Shader 1:
Code:
float4x4 mViewProj;
float4x4 mView;
float4 view_position;
float3 watercolour;
float LODbias;
float sun_shininess, sun_strength;
float3 sun_vec;
float reflrefr_offset;
bool diffuseSkyRef;
texture EnvironmentMap;
texture FresnelMap;
texture Heightmap;
texture Normalmap;
texture Reflectionmap;
texture Refractionmap;
texture noiseXZ;
struct VS_INPUT
{
float3 Pos : POSITION;
float3 Normal : NORMAL;
float2 tc : TEXCOORD0;
};
samplerCUBE sky = sampler_state
{
Texture = <EnvironmentMap>;
MipFilter = NONE;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
//MipMapLodBias = (LODbias);
//SRGBTexture = true;
};
sampler fresnel = sampler_state
{
Texture = <FresnelMap>;
MipFilter = NONE;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
};
sampler reflmap = sampler_state
{
Texture = <Reflectionmap>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
MipMapLodBias = (LODbias);
};
sampler refrmap = sampler_state
{
Texture = <Refractionmap>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
MipMapLodBias = (LODbias);
};
struct VS_NV20
{
float4 Pos : POSITION;
float2 dot : TEXCOORD0;
float3 R : TEXCOORD1;
float2 refr_tc : TEXCOORD2;
float2 refl_tc : TEXCOORD3;
float3 sunlight : COLOR0;
};
VS_NV20 VShaderNV20(VS_INPUT i)
{
VS_NV20 o;
o.Pos = mul(float4(i.Pos.xyz,1), mViewProj);
float3 normal = normalize(i.Normal.xyz);
float3 v = normalize(i.Pos.xyz - view_position.xyz/view_position.w);
o.R = reflect(v,normal);
o.dot = dot(o.R,normal);
float sunlight = pow(saturate(dot(o.R, sun_vec)),sun_shininess);
o.sunlight = sunlight*float3(1.2, 0.8, 0.6);
float4 tpos = mul(float4(i.Pos.x,0,i.Pos.z,1), mViewProj);
tpos.xyz = tpos.xyz/tpos.w;
tpos.xy = 0.5 + 0.5*tpos.xy*float2(1,-1);
tpos.z = reflrefr_offset/tpos.z;
o.refr_tc = tpos.xy - tpos.z*normal.xz;
o.refl_tc = tpos.xy - tpos.z*normal.xz;
return o;
}
VS_NV20 VShaderNV30(VS_INPUT i)
{
VS_NV20 o;
o.Pos = mul(float4(i.Pos.xyz,1), mViewProj);
float3 normal = normalize(i.Normal.xyz);
float3 v = normalize(i.Pos.xyz - view_position.xyz/view_position.w);
o.R = reflect(v,normal);
o.dot = dot(o.R,normal);
float sunlight = pow(saturate(dot(o.R, sun_vec)),sun_shininess);
o.sunlight = sunlight*float3(1.2, 0.4, 0.1);
float4 tpos = mul(float4(i.Pos.x,0,i.Pos.z,1), mViewProj);
tpos.xyz = tpos.xyz/tpos.w;
tpos.xy = 0.5 + 0.5*tpos.xy*float2(1,-1);
tpos.z = reflrefr_offset/tpos.z;
o.refr_tc = tpos.xy - tpos.z*normal.xz;
o.refl_tc = tpos.xy - tpos.z*normal.xz;
return o;
}
float4 PShaderNV20(VS_NV20 i) : COLOR
{
float4 ut;
ut.a = 1;
float f = tex1D(fresnel,i.dot);
float3 global_refl = texCUBE(sky,i.R);
float4 local_refl = tex2D(reflmap, i.refl_tc);
float3 refr = tex2D(refrmap, i.refr_tc);
float3 refl = lerp( global_refl, local_refl.rgb, local_refl.a);
ut.rgb = lerp( refr, refl, f) + i.sunlight*sun_strength;
return ut;
}
float4 PShaderNV30(VS_NV20 i) : COLOR
{
float4 ut;
ut.a = 1;
float f = tex1D(fresnel,i.dot);
float3 global_refl = texCUBE(sky,i.R) + i.sunlight.rgb*sun_strength;
float4 local_refl = tex2D(reflmap, i.refl_tc);
float3 refr = tex2D(refrmap, i.refr_tc);
float3 refl = lerp( global_refl, local_refl.rgb, local_refl.a);
ut.rgb = lerp( refr, refl, f);
return ut;
}
technique T0
{
pass P0
{
pixelshader = compile ps_2_0 PShaderNV30();
vertexshader = compile vs_2_0 VShaderNV30();
}
}
technique T1
{
pass P0
{
pixelshader = compile ps_1_4 PShaderNV20();
vertexshader = compile vs_1_1 VShaderNV20();
}
}
technique T2
{
pass P0
{
pixelshader = compile ps_1_1 PShaderNV20();
vertexshader = compile vs_1_1 VShaderNV20();
}
}
Shader 2:
Code:
float4x4 mViewProj;
float4x4 mView;
float4 view_position;
float3 watercolour;
float LODbias;
float sun_shininess, sun_strength;
float3 sun_vec;
float reflrefr_offset;
bool diffuseSkyRef;
texture EnvironmentMap;
texture FresnelMap;
texture Heightmap;
texture Normalmap;
texture Refractionmap;
texture Reflectionmap;
texture noiseXZ;
struct VS_INPUT
{
float3 Pos : POSITION;
float3 Normal : NORMAL;
float2 tc : TEXCOORD0;
};
struct VS_OUTPUT
{
float4 Pos : POSITION;
float2 tc : TEXCOORD0;
float3 normal : TEXCOORD1;
float3 viewvec : TEXCOORD2;
float3 screenPos : TEXCOORD3;
float3 worldPos : TEXCOORD4;
float3 screenPosDis : TEXCOORD5;
};
samplerCUBE sky = sampler_state
{
Texture = <EnvironmentMap>;
MipFilter = NONE;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
//MipMapLodBias = (LODbias);
// SRGBTexture = true;
};
sampler fresnel = sampler_state
{
Texture = <FresnelMap>;
MipFilter = NONE;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
};
sampler hmap = sampler_state
{
Texture = <Heightmap>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
};
sampler nmap = sampler_state
{
Texture = <Normalmap>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
};
sampler refrmap = sampler_state
{
Texture = <Refractionmap>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
};
sampler reflmap = sampler_state
{
Texture = <Reflectionmap>;
MipFilter = LINEAR;
MinFilter = LINEAR;
MagFilter = LINEAR;
AddressU = CLAMP;
AddressV = CLAMP;
MipMapLodBias = (LODbias);
};
sampler noise = sampler_state
{
texture = <noiseXZ>;
AddressU = WRAP;
AddressV = WRAP;
MIPFILTER = POINT; //LINEAR;
MINFILTER = LINEAR;
MAGFILTER = LINEAR;
};
/* DX9 class shaders */
VS_OUTPUT VShaderR300(VS_INPUT i)
{
VS_OUTPUT o;
o.worldPos = i.Pos.xyz/4;
o.Pos = mul(float4(i.Pos.xyz,1), mViewProj);
o.normal = normalize(i.Normal.xyz);
o.viewvec = normalize(i.Pos.xyz - view_position.xyz/view_position.w);
o.tc = i.tc;
o.screenPosDis = (o.Pos.xyz / o.Pos.w);
o.screenPosDis.xy = 0.5 + 0.5*o.screenPosDis.xy*float2(1,-1);
o.screenPosDis.z = reflrefr_offset/o.screenPosDis.z;
// alt screenpos
float4 tpos = mul(float4(i.Pos.x,0,i.Pos.z,1), mViewProj);
o.screenPos = tpos.xyz/tpos.w;
o.screenPos.xy = 0.5 + 0.5*o.screenPos.xy*float2(1,-1);
o.screenPos.z = reflrefr_offset/o.screenPos.z;
return o;
}
float4 PShaderR300(VS_OUTPUT i) : COLOR
{
float4 ut;
ut.a = 1;
float3 v = i.viewvec;
float3 N = 2*tex2D(nmap,i.tc)-1;
float3 R = normalize(reflect(v,N));
//R.y = max(R.y,0);
float f = tex1D(fresnel,dot(R,N));
float3 sunlight = sun_strength*pow(saturate(dot(R, sun_vec)),sun_shininess)*float3(1.2, 0.4, 0.1);
float4 refl = tex2D(reflmap,i.screenPos.xy-i.screenPos.z*N.xz);
float3 skyrefl;
skyrefl = texCUBE(sky,R);
float3 col = lerp(skyrefl+sunlight,refl.rgb,refl.a);
float3 refr = tex2D(refrmap,i.screenPos.xy-i.screenPos.z*N.xz);
ut.rgb = lerp( refr, col, f);
return ut;
}
technique T0
{
pass P0
{
pixelshader = compile ps_2_0 PShaderR300();
vertexshader = compile vs_1_1 VShaderR300();
}
}