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; 
	}