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