// Globals float4x4 view_proj_matrix : WorldViewProjection; float time : Time; float4x4 inv_view_matrix : WorldInverse; float4x4 view_matrix : World; float4 view_position; float4 Light_Attenuation; float4 Light_Color; float4 Light_Ambient; //float4x4 TransWorld; struct VS_OUTPUT { float4 Position : POSITION; float2 TexCoord: TEXCOORD0; float4 LightDir: TEXCOORD1; float3 HalfVect: TEXCOORD2; }; VS_OUTPUT vertexMain( float4 inPos: POSITION, float3 inNormal: NORMAL, float3 inTangent:TANGENT, float3 inBinormal:BINORMAL, float2 inTxr: TEXCOORD0) { // Set out output VS_OUTPUT Out; // Make a "wave" pattern. float ltime=(time/1000); inPos.y+=10*(sin((-0.01*inPos.x+0.07*inPos.z)+ltime*1.3)*0.5+0.5); // Position the vertex based on our projection Out.Position = mul(inPos, view_proj_matrix); Out.TexCoord = inTxr; // Calculate distance form light to vertex and its direction float4 LightDir; LightDir.xyz = mul(float3(80,00,-80),inv_view_matrix) - inPos; float Dist = length(LightDir.xyz); LightDir.xyz = LightDir.xyz / Dist; // Calculate vertex/distance based attenuation LightDir.w = clamp(0,1, 1 / ( Light_Attenuation.x + Light_Attenuation.y * Dist + Light_Attenuation.z * Dist * Dist )); // Determine the eye vector float3 EyeVector = normalize(view_position-inPos); // transform to tangent sspace float3x3 TangentSpace; TangentSpace[0] = inTangent; TangentSpace[1] = inBinormal; TangentSpace[2] = inNormal; Out.HalfVect = mul(TangentSpace,normalize(LightDir.xyz+EyeVector)); Out.LightDir = float4(mul(TangentSpace,LightDir.xyz),LightDir.w); return Out; } //float4 Light1_Color; sampler2D tex0; sampler2D tex1; float4 Light_Point(float3 Normal, float3 HalfVect, float4 LightDir, float4 LightColor) { // Compute both specular and diffuse factors float SpecularAttn = pow( clamp(0, 1,dot(Normal, HalfVect)),16); float DiffuseAttn = clamp(0, 1,dot(Normal, LightDir)); // Compute final lighting float4 finallight = LightColor * LightDir.w * (SpecularAttn+DiffuseAttn); finallight.y = 1.0; return finallight; } float4 pixelMain(float2 inTxr:TEXCOORD0,float4 LightDir:TEXCOORD1, float3 HalfVect:TEXCOORD2) : COLOR { // Read bump and influence the normal float3 normal = tex2D(tex1,inTxr) * 2 - 1; // Output lighting color float4 lightdat = tex2D(tex0,inTxr)* (0.15+Light_Point(normal,HalfVect,LightDir,Light_Color)); return lightdat; //return float4(normal, 1.0); }