what i have done so far is only pass the textures in the wrong positions
lightingFX.fx->SetMatrix(lightingFX.xWorld, &position);
lightingFX.fx->SetMatrix(lightingFX.xWorldViewProjection, &(position*view*proj));
lightingFX.fx->Begin(&numPasses,0);
for (unsigned int i = 1; i<numMtrls; i++)
{
lightingFX.fx->BeginPass(0);
lightingFX.fx->SetTexture("xColoredTexture", texture);
lightingFX.fx->CommitChanges();
mesh->DrawSubset(i);
lightingFX.fx->EndPass();
}[/quote]
//the HLSL file
float4x4 xWorldViewProjection;
float4x4 xWorld;
float3 xLightPos;
float xLightPower;
float xAmbient;
float4 color = float4(1, 0.8, 0.8, 1);
Texture xTexture;
sampler TextureSampler = sampler_state { texture = <xTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};
struct VertexToPixel
{
float4 Position : POSITION;
float2 TexCoords : TEXCOORD0;
float3 Normal : TEXCOORD1;
float3 Position3D : TEXCOORD2;
};
struct PixelToFrame
{
float4 Color : COLOR0;
};
float DotProduct(float3 lightPos, float3 pos3D, float3 normal)
{
float3 lightDir = normalize(pos3D - lightPos);
return dot(-lightDir, normal);
}
float distance(float3 lightPos, float3 PixelPos3D)
{
float xd = lightPos.x - PixelPos3D.x;
float yd = lightPos.y - PixelPos3D.y;
float zd = lightPos.z - PixelPos3D.z;
return sqrt(xd*xd + yd*yd + zd*zd);
}
VertexToPixel SimplestVertexShader( float4 inPos : POSITION0, float3 inNormal: NORMAL0, float2 inTexCoords : TEXCOORD0)
{
VertexToPixel Output = (VertexToPixel)0;
Output.Position =mul(inPos, xWorldViewProjection);
Output.TexCoords = inTexCoords;
Output.Normal = normalize(mul(inNormal, (float3x3)xWorld));
Output.Position3D = mul(inPos, xWorld);
return Output;
}
PixelToFrame OurFirstPixelShader(VertexToPixel PSIn)
{
PixelToFrame Output = (PixelToFrame)0;
float diffuseLightingFactor = DotProduct(xLightPos, PSIn.Position3D, PSIn.Normal);
diffuseLightingFactor = saturate(diffuseLightingFactor);
diffuseLightingFactor *= xLightPower;
float dis = distance(xLightPos, PSIn.Position3D)/10;
PSIn.TexCoords.y--;
float4 baseColor = tex2D(TextureSampler, PSIn.TexCoords);
Output.Color = baseColor*(diffuseLightingFactor + xAmbient)*color/dis;
return Output;
}
technique Simplest
{
pass Pass0
{
VertexShader = compile vs_2_0 SimplestVertexShader();
PixelShader = compile ps_2_0 OurFirstPixelShader();
}
}[/quote]