www.pudn.com > waterworld_src_exe.rar > OceanWater.psh
//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
sampler BumpTex0;
sampler BumpTex1;
sampler CubeTex;
float4 watercolor : register(c0);
float4 waterhighcolor : register(c1);
//-----------------------------------------------------------------------------
// Vertex shader input structure
//-----------------------------------------------------------------------------
struct PS_INPUT
{
float2 tcBump0 : TEXCOORD0; //texture coordinates
float2 tcBump1 : TEXCOORD1; //texture coordinates
float3 vEye : TEXCOORD2; //eye vector
float3x3 mToWorld: TEXCOORD3;
};
//-----------------------------------------------------------------------------
// Vertex shader output structure
//-----------------------------------------------------------------------------
struct PS_OUTPUT
{
float4 vColor : COLOR0;
};
//
// Main
//
PS_OUTPUT Main(PS_INPUT input)
{
// zero out members of output
PS_OUTPUT output;
// sample appropriate textures
float3 vNormal0 = tex2D(BumpTex0, input.tcBump0).xyz;
float3 vNormal1 = tex2D(BumpTex1, input.tcBump1).xyz;
float3 vNormal = (vNormal0 + vNormal1 )/2;
vNormal = mul(vNormal, input.mToWorld);
float eDotN = dot(input.vEye, vNormal);
float3 vEyeReflected = 2* eDotN * vNormal - input.vEye;
float4 reflection = texCUBE(CubeTex, vEyeReflected);
float Fresnel = (1 - eDotN)*reflection.g ;
float4 diffuse = watercolor * 0.5 * eDotN;
float4 color = saturate(lerp(diffuse,reflection * 1.2 * eDotN,Fresnel) + reflection * 0.3);
float4 specular = waterhighcolor * pow(reflection.g,8) * eDotN ;
output.vColor = saturate(color + specular);
return output;
}