float4x4 ProjectionModelViewMatrix; float4x4 ProjectionMatrix; float4x4 ModelViewMatrix; float4x4 NormalMatrix; float4 c3d_MatDiffuse; float4 c3d_MatAmbient; float c3d_MatShininess; float4 c3d_MatSpecular; float4 c3d_LightsPosition[8]; float4 c3d_LightsDiffuse[8]; float4 c3d_LightsAmbient[8]; float4 c3d_LightsSpecular[8]; struct VtxInput { float4 Position : POSITION0; float3 Normal : NORMAL0; float2 Texture : TEXCOORD0; }; struct VtxOuput { float4 Position : POSITION0; float2 Texture : TEXCOORD0; float3 EyeNormal : NORMAL0; float3 EyePosition : POSITION1; }; VtxOuput mainVx( in VtxInput p_input) { VtxOuput l_output; l_output.Position = mul( p_input.Position, ProjectionModelViewMatrix); l_output.Texture = p_input.Texture; l_output.EyeNormal = normalize( mul( p_input.Normal, (float3x3)NormalMatrix)); l_output.EyePosition = normalize( mul( p_input.Position, ModelViewMatrix).xyz); return l_output; } float4 mainPx( in VtxOuput p_input) : COLOR0 { float4 final_color = float4( 0, 0, 0, 0); int i; float4 l_ambient; float4 l_diffuse; float4 l_specular; int l_iCount = 1; for (i = 0 ; i < 3 ; i++) { float3 l_position = normalize( mul( c3d_LightsPosition[i], ModelViewMatrix).xyz); l_diffuse = c3d_LightsDiffuse[i] * c3d_MatDiffuse * max( dot( p_input.EyeNormal, l_position), 0.0); l_specular = c3d_LightsSpecular[i] * c3d_MatSpecular * pow( max( dot( normalize( l_position - p_input.EyePosition), p_input.EyeNormal), 0.0), c3d_MatShininess); final_color += l_diffuse + l_specular; l_iCount += 1; } return final_color / l_iCount; }