www.pudn.com > waterworld_src_exe.rar > OceanWater.vsh


//----------------------------------------------------------------------------- 
// Global variables 
//----------------------------------------------------------------------------- 
float4x4 mWorldViewProj: register(c0);  // Composite World-View-Projection Matrix 
float4 vCamera: register(c4);  
float4 vWaveHeight: register(c5); 
float4 vWaveOffset: register(c6); 
float4 vWaveSpeed: register(c7); 
float4 vWaveDirX: register(c8); 
float4 vWaveDirY: register(c9); 
float fTime: register(c10);	       // Time parameter. This keeps increasing 
float4 vDistortion: register(c11); 
float4x4 mWorld: register(c12);  // World Martix transformation 
 
//----------------------------------------------------------------------------- 
// Vertex shader input structure 
//----------------------------------------------------------------------------- 
struct VS_INPUT 
 { 
	float4 vPosition : POSITION;     //position in object space 
	float3 vNormal : NORMAL;         //normal 
	float4 vWaveHeightScale : COLOR; //Wave Height Scale 
	float2 tcCoord : TEXCOORD0;   //texture coordinates 
	float3 vTangent : TANGENT;   //tangent 
}; 
 
 
//----------------------------------------------------------------------------- 
// Vertex shader output structure 
//----------------------------------------------------------------------------- 
struct VS_OUTPUT 
{ 
	float4 vPosition   : POSITION;   // vertex position  
	float2 tcBump0 : TEXCOORD0; //texture coordinates 
	float2 tcBump1 : TEXCOORD1; //texture coordinates 
	float3 vEye : TEXCOORD2; //eye vector 
	float3x3 mToWorld: TEXCOORD3; 
}; 
 
// 
// Main 
// 
 
VS_OUTPUT Main( const VS_INPUT input ) 
{ 
	VS_OUTPUT output; 
	 
	float4 fSin, fCos;  
	 
	float4 vAngle = frac(input.tcCoord.x * vWaveDirX + input.tcCoord.y * vWaveDirY + (fTime * vWaveSpeed)) * 2*3.14159265f; 
	sincos(vAngle, fSin, fCos); 
 
	fSin = fSin * (1-input.vWaveHeightScale.x)*0.2 ; 
	fCos = fCos * (1-input.vWaveHeightScale.x)*0.2 ; 
 
	float4 vNewPos; 
	vNewPos.xyz = input.vPosition.xyz + dot(fSin, vWaveHeight) * input.vNormal.xyz; 
	vNewPos.w = 1.0f; 
        output.vPosition = mul(vNewPos, mWorldViewProj ); 
 
	// tangent to world 
	float2 vTemp; 
        vTemp.x = dot(fCos*vWaveHeight, vWaveDirX)*2*3.14; 
        vTemp.y = dot(fCos*vWaveHeight, vWaveDirY)*2*3.14; 
	 
	float3 vNormal = {-vTemp.x, -vTemp.y, input.vNormal.z}; 
	vNormal	= normalize(mul(vNormal, mWorld));  
	float3 vTangent = {input.vTangent.x, input.vTangent.y , vTemp.x};	 
	vTangent = normalize(mul(vTangent, mWorld)); 
	float3 vBinormal =  cross(vNormal,vTangent); 
	vBinormal = normalize(mul(vBinormal, mWorld)); 
 
	output.mToWorld[0] = vBinormal; 
	output.mToWorld[1] = vTangent; 
	output.mToWorld[2] = vNormal; 
 
	//view vector 
	output.vEye = normalize(vCamera - mul(vNewPos, mWorld)); 
	// 
	output.tcBump0.xy = frac(fTime * vDistortion.xy) + input.tcCoord.xy; 
	output.tcBump1.xy = frac(fTime * vDistortion.zw) + input.tcCoord.xy; 
 
	return output; 
}