#define MaxLights 3 float4x4 World; float4x4 WorldViewProjection; float DiffuseIntensity0; float4 DiffuseColor0; float3 LightDirection0; float4 SpecularColor0; float SpecularIntensity0; float DiffuseIntensity1; float4 DiffuseColor1; float3 LightDirection1; float4 SpecularColor1; float SpecularIntensity1; float DiffuseIntensity2; float4 DiffuseColor2; float3 LightDirection2; float4 SpecularColor2; float SpecularIntensity2; sampler ColorMapSampler : register(s0); struct VS_IN { float4 Pos : POSITION; float2 Tex : TEXCOORD0; float3 Norm : NORMAL; }; struct VS_OUT { float4 oPos : POSITION; float2 oTex : TEXCOORD0; float3 oLight[MaxLights] : TEXCOORD1; float3 oNormal : TEXCOORD4; float3 oCamView : TEXCOORD5; }; struct PS_OUT { float4 Color : COLOR; }; VS_OUT VS_AmbientDiffuse(VS_IN input, uniform float3 CameraPos) { VS_OUT output /*= (VS_OUT)0*/; output.oPos = mul(WorldViewProjection,input.Pos); // Normalize the light directions output.oTex = input.Tex; output.oLight[0] = normalize(LightDirection0); output.oLight[1] = normalize(LightDirection1); output.oLight[2] = normalize(LightDirection2); output.oNormal = normalize(mul(World,float4(input.Norm,0.0f))); output.oCamView = CameraPos - mul(World, input.Pos); return output; } PS_OUT PS_AmbientDiffuse(VS_OUT input, uniform float4 AmbientColor, uniform float AmbientIntensity) { PS_OUT output = (PS_OUT)0; // Get ambient light AmbientColor *= AmbientIntensity; // Get diffuse light float4 TotalDiffuseColor = float4(0,0,0,0); TotalDiffuseColor += (DiffuseIntensity0 * DiffuseColor0) * saturate(dot(input.oLight[0],input.oNormal)); TotalDiffuseColor += (DiffuseIntensity2 * DiffuseColor1) * saturate(dot(input.oLight[1],input.oNormal)); TotalDiffuseColor += (DiffuseIntensity1 * DiffuseColor2) * saturate(dot(input.oLight[2],input.oNormal)); float3 Half0 = normalize(input.oLight[0] + normalize(input.oCamView)); float3 Half1 = normalize(input.oLight[1] + normalize(input.oCamView)); float3 Half2 = normalize(input.oLight[2] + normalize(input.oCamView)); float specular0 = pow(saturate(dot(input.oNormal,Half0)),25); float specular1 = pow(saturate(dot(input.oNormal,Half1)),25); float specular2 = pow(saturate(dot(input.oNormal,Half2)),25); float4 texCol = tex2D(ColorMapSampler,input.oTex); texCol *= AmbientColor + TotalDiffuseColor; output.Color = texCol + ((SpecularColor0 * SpecularIntensity0) * specular0) + ((SpecularColor1 * SpecularIntensity1) * specular1) + ((SpecularColor2 * SpecularIntensity2) * specular2); return output; }