struct ShadedTex_OUT { float4 vPos : POSITION; float4 texCoord : TEXCOORD0; float4 wNormal : TEXCOORD1; float4 wPos : TEXCOORD2; }; #define SAMPLECUTDIST2 0.01 float4 TexturedShadedOneLight_PS(ShadedTex_OUT IN, uniform float3 lightPos, uniform float3 lightDir, uniform float3 lightColor, uniform float lightPower, uniform sampler2D colorTex : register(s0)):COLOR0 { float4 color = 1; lightDir = normalize(lightDir); IN.wNormal.xyz = normalize(IN.wNormal.xyz); float3 diff = lightPos - IN.wPos; float dist2 = dot(diff, diff); if(dist2 < SAMPLECUTDIST2) dist2 = SAMPLECUTDIST2; diff = normalize(diff); float cosa = max(dot(lightDir, -diff), 0); float cosb = max(dot(IN.wNormal.xyz, diff), 0); color.rgb = pow(cosa, 9) * cosb / dist2 * lightPower; //color.rgb *= lightPower; //return 0; return color * tex2D(colorTex, IN.texCoord); }