const float4x4 matWorldViewProj; // World*view*projection matrix.
const float4x4 matWorld; // World matrix.
const float4 vecAmbient; // Ambient color.
const float4 vecViewPos; // View position.
float4 vecLightPos[8];
float4 vecLightColor[8];
float4 vecLightDir[8];
texture entSkin1;
texture entSkin2;
sampler ColorMapSampler = sampler_state
{
Texture = <entSkin1>;
};
sampler ShadowMapSampler = sampler_state
{
Texture = <entSkin2>;
};
void PixelVS_lm(
in float4 InPos: POSITION,
in float3 InNormal: NORMAL,
in float2 InTex: TEXCOORD0,
in float4 InShadow: TEXCOORD1,
out float4 OutPos: POSITION,
out float2 OutTex: TEXCOORD0,
out float4 OutShadow: TEXCOORD1,
out float3 OutNormal: TEXCOORD2,
out float3 OutWorldPos: TEXCOORD3)
{
OutPos = mul(InPos, matWorldViewProj);
OutTex = InTex;
OutShadow = InShadow;
OutNormal = InNormal;
OutWorldPos = mul(InPos, matWorld).xyz;
}
float4 PixelPS_lm(
in float2 InTex: TEXCOORD0,
in float4 InShadow: TEXCOORD1,
in float3 InNormal: TEXCOORD2,
in float3 InWorldPos: TEXCOORD3): COLOR
{
int i;
float3 dir;
float fac,lfac;
InNormal = normalize(InNormal);
float4 Shadow = tex2D(ShadowMapSampler, InShadow);
float4 Color = tex2D(ColorMapSampler, InTex);
float4 Light = 0;
for(i = 0; i < 8; i++)
{
dir = vecLightPos[i].xyz-InWorldPos;
fac = 1-saturate(length(dir)/vecLightPos[i].w);
Light += vecLightColor[i]*fac*saturate(vecLightPos[i].w);
}
return Color*(Shadow+Light*2);
}
technique ShadowTechnique_lm
{
pass P0
{
VertexShader = compile vs_2_0 PixelVS_lm();
PixelShader = compile ps_2_0 PixelPS_lm();
}
}
///////////////////////////////////////////////////
void PixelVS(
in float4 InPos: POSITION,
in float3 InNormal: NORMAL,
in float2 InTex: TEXCOORD0,
out float4 OutPos: POSITION,
out float2 OutTex: TEXCOORD0,
out float3 OutNormal: TEXCOORD1,
out float3 OutWorldPos: TEXCOORD2)
{
OutPos = mul(InPos, matWorldViewProj);
OutTex = InTex;
OutNormal = mul(InNormal, matWorld);
OutWorldPos = mul(InPos, matWorld).xyz;
}
float4 PixelPS(
in float2 InTex: TEXCOORD0,
in float3 InNormal: TEXCOORD1,
in float3 InWorldPos: TEXCOORD2): COLOR
{
int i;
float3 dir;
float fac,lfac;
InNormal = normalize(InNormal);
float4 Color = tex2D(ColorMapSampler, InTex);
float4 Light = 0;
for(i = 0; i < 8; i++)
{
dir = vecLightPos[i].xyz-InWorldPos;
fac = 1-saturate(length(dir)/vecLightPos[i].w);
fac *= saturate(dot(normalize(dir),InNormal));
Light += vecLightColor[i]*fac*saturate(vecLightPos[i].w);
}
return Color*(vecAmbient+Light*2);
}
technique ShadowTechnique
{
pass P0
{
VertexShader = compile vs_2_0 PixelVS();
PixelShader = compile ps_2_0 PixelPS();
}
}