I've written a fully commented example to go with it so it's easy to understand how to use it.
+ Code Snippet//====================================================
// Cubic Shadow Mapping
//====================================================
// By EVOLVED, adapted for multiple lights by Bruce Browning
// www.evolved-software.com
//====================================================
//--------------
// un-tweaks
//--------------
matrix WorldVP:WorldViewProjection;
matrix World:World;
matrix ViewInv:ViewInverse;
//--------------
// Tweaks
//--------------
float3 Ambient={0.01f,0.01f, 0.01f};
float4 FogColor={0.8f,0.8f,0.8f,1.0f};
float FogRange=2500.0f;
float Alpha=1.0f;
//L0
float4 LPos_0={150.0f,150.0f,0.0f,1.0f};
float3 LCol_0={1.0f,1.0f,1.0f};
float LRng_0=350.0f;
//L1
float4 LPos_1={-150.0f,150.0f,0.0f,1.0f};
float3 LCol_1={1.0f,1.0f,1.0f};
float LRng_1=350.0f;
//L2
float4 LPos_2={-150.0f,150.0f,0.0f,1.0f};
float3 LCol_2={1.0f,1.0f,1.0f};
float LRng_2=350.0f;
//L3
float4 LPos_3={-150.0f,150.0f,0.0f,1.0f};
float3 LCol_3={1.0f,1.0f,1.0f};
float LRng_3=350.0f;
//L4
float4 LPos_4={-150.0f,150.0f,0.0f,1.0f};
float3 LCol_4={1.0f,1.0f,1.0f};
float LRng_4=350.0f;
//L5
float4 LPos_5={-150.0f,150.0f,0.0f,1.0f};
float3 LCol_5={1.0f,1.0f,1.0f};
float LRng_5=350.0f;
//--------------
// Textures
//--------------
texture BaseTX <string Name=\"\";>;
sampler2D Base = sampler_state
{
texture = <BaseTX>;
};
texture NormalTX <string Name=\"\";>;
sampler2D Normal = sampler_state
{
texture = <NormalTX>;
};
texture DepthMapTX_0 <string Name=\"\";>;
sampler DepthMap_0 = sampler_state
{
texture = <DepthMapTX_0>;
};
texture DepthMapTX_1 <string Name=\"\";>;
sampler DepthMap_1 = sampler_state
{
texture = <DepthMapTX_1>;
};
texture DepthMapTX_2 <string Name=\"\";>;
sampler DepthMap_2 = sampler_state
{
texture = <DepthMapTX_2>;
};
texture DepthMapTX_3 <string Name=\"\";>;
sampler DepthMap_3 = sampler_state
{
texture = <DepthMapTX_3>;
};
texture DepthMapTX_4 <string Name=\"\";>;
sampler DepthMap_4 = sampler_state
{
texture = <DepthMapTX_4>;
};
texture DepthMapTX_5 <string Name=\"\";>;
sampler DepthMap_5 = sampler_state
{
texture = <DepthMapTX_5>;
};
//--------------
// structs
//--------------
struct IN_Depth
{
float4 Pos:POSITION;
};
struct OUT_Depth
{
float4 OPos:POSITION;
float3 Depth:TEXCOORD1;
};
struct IN_NormalMap
{
float4 Pos:POSITION;
float2 UV:TEXCOORD;
float3 Normal:NORMAL;
float3 Tangent:TANGENT;
float3 Binormal:BINORMAL;
};
struct OUT_NormalMap
{
float4 OPos:POSITION;
float2 Tex:TEXCOORD0;
float3 LightVec:TEXCOORD1;
float3 Attenuation:TEXCOORD2;
float3 ViewVec:TEXCOORD3;
float3 ShadowMap:TEXCOORD4;
float Fog:FOG;
};
//--------------
// vertex shaders
//--------------
//--Depth--
OUT_Depth VS_L0(IN_Depth IN)
{
OUT_Depth OUT;
OUT.OPos = mul(IN.Pos,WorldVP);
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_0-WPos;
OUT.Depth=-(LightPos/LRng_0);
return OUT;
}
OUT_Depth VS_L1(IN_Depth IN)
{
OUT_Depth OUT;
OUT.OPos = mul(IN.Pos,WorldVP);
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_1-WPos;
OUT.Depth=-(LightPos/LRng_1);
return OUT;
}
OUT_Depth VS_L2(IN_Depth IN)
{
OUT_Depth OUT;
OUT.OPos = mul(IN.Pos,WorldVP);
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_2-WPos;
OUT.Depth=-(LightPos/LRng_2);
return OUT;
}
OUT_Depth VS_L3(IN_Depth IN)
{
OUT_Depth OUT;
OUT.OPos = mul(IN.Pos,WorldVP);
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_3-WPos;
OUT.Depth=-(LightPos/LRng_3);
return OUT;
}
OUT_Depth VS_L4(IN_Depth IN)
{
OUT_Depth OUT;
OUT.OPos = mul(IN.Pos,WorldVP);
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_4-WPos;
OUT.Depth=-(LightPos/LRng_4);
return OUT;
}
OUT_Depth VS_L5(IN_Depth IN)
{
OUT_Depth OUT;
OUT.OPos = mul(IN.Pos,WorldVP);
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_5-WPos;
OUT.Depth=-(LightPos/LRng_5);
return OUT;
}
//--Mapping--
OUT_NormalMap VS_NormalMap_L0(IN_NormalMap IN)
{
OUT_NormalMap OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Tex=IN.UV;
float3x3 TBN={IN.Tangent,IN.Binormal,IN.Normal};
TBN=transpose(mul(TBN,World));
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_0-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-(LightPos/LRng_0);
OUT.ViewVec=mul(ViewPos,TBN);
OUT.ShadowMap=-LightPos;
OUT.Fog=1-saturate(dot(ViewPos/FogRange,ViewPos/FogRange));
return OUT;
}
OUT_NormalMap VS_NormalMap_L1(IN_NormalMap IN)
{
OUT_NormalMap OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Tex=IN.UV;
float3x3 TBN={IN.Tangent,IN.Binormal,IN.Normal};
TBN=transpose(mul(TBN,World));
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_1-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-(LightPos/LRng_1);
OUT.ViewVec=mul(ViewPos,TBN);
OUT.ShadowMap=-LightPos;
OUT.Fog=1-saturate(dot(ViewPos/FogRange,ViewPos/FogRange));
return OUT;
}
OUT_NormalMap VS_NormalMap_L2(IN_NormalMap IN)
{
OUT_NormalMap OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Tex=IN.UV;
float3x3 TBN={IN.Tangent,IN.Binormal,IN.Normal};
TBN=transpose(mul(TBN,World));
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_2-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-(LightPos/LRng_2);
OUT.ViewVec=mul(ViewPos,TBN);
OUT.ShadowMap=-LightPos;
OUT.Fog=1-saturate(dot(ViewPos/FogRange,ViewPos/FogRange));
return OUT;
}
OUT_NormalMap VS_NormalMap_L3(IN_NormalMap IN)
{
OUT_NormalMap OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Tex=IN.UV;
float3x3 TBN={IN.Tangent,IN.Binormal,IN.Normal};
TBN=transpose(mul(TBN,World));
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_3-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-(LightPos/LRng_3);
OUT.ViewVec=mul(ViewPos,TBN);
OUT.ShadowMap=-LightPos;
OUT.Fog=1-saturate(dot(ViewPos/FogRange,ViewPos/FogRange));
return OUT;
}
OUT_NormalMap VS_NormalMap_L4(IN_NormalMap IN)
{
OUT_NormalMap OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Tex=IN.UV;
float3x3 TBN={IN.Tangent,IN.Binormal,IN.Normal};
TBN=transpose(mul(TBN,World));
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_4-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-(LightPos/LRng_4);
OUT.ViewVec=mul(ViewPos,TBN);
OUT.ShadowMap=-LightPos;
OUT.Fog=1-saturate(dot(ViewPos/FogRange,ViewPos/FogRange));
return OUT;
}
OUT_NormalMap VS_NormalMap_L5(IN_NormalMap IN)
{
OUT_NormalMap OUT;
OUT.OPos=mul(IN.Pos,WorldVP);
OUT.Tex=IN.UV;
float3x3 TBN={IN.Tangent,IN.Binormal,IN.Normal};
TBN=transpose(mul(TBN,World));
float3 WPos=mul(IN.Pos,World);
float3 LightPos=LPos_5-WPos;
float3 ViewPos=ViewInv[3].xyz-WPos;
OUT.LightVec=mul(LightPos,TBN);
OUT.Attenuation=-(LightPos/LRng_5);
OUT.ViewVec=mul(ViewPos,TBN);
OUT.ShadowMap=-LightPos;
OUT.Fog=1-saturate(dot(ViewPos/FogRange,ViewPos/FogRange));
return OUT;
}
//--------------
// pixel shaders
//--------------
//--Depth--
float4 PS_L0(OUT_Depth IN) : COLOR
{
return float4(length(IN.Depth)+0.011f,0,0,1);
}
float4 PS_L1(OUT_Depth IN) : COLOR
{
return float4(length(IN.Depth)+0.011f,0,0,1);
}
float4 PS_L2(OUT_Depth IN) : COLOR
{
return float4(length(IN.Depth)+0.011f,0,0,1);
}
float4 PS_L3(OUT_Depth IN) : COLOR
{
return float4(length(IN.Depth)+0.011f,0,0,1);
}
float4 PS_L4(OUT_Depth IN) : COLOR
{
return float4(length(IN.Depth)+0.011f,0,0,1);
}
float4 PS_L5(OUT_Depth IN) : COLOR
{
return float4(length(IN.Depth)+0.011f,0,0,1);
}
//--Mapping--
// L0
float4 PS_NormalMap_L0(OUT_NormalMap IN) : COLOR
{
float4 Texture=tex2D(Base,IN.Tex);
float3 NormalMap=tex2D(Normal,IN.Tex)*2-1;
float3 LightV=normalize(IN.LightVec);
float3 ViewV=normalize(IN.ViewVec);
NormalMap=normalize(NormalMap);
float Normal=saturate(dot(reflect(-ViewV,NormalMap),LightV));
Normal=pow(Normal,16)+saturate(dot(NormalMap,LightV));
float3 Light=LCol_0*(1-dot(IN.Attenuation,IN.Attenuation));
float Depth=length(IN.Attenuation);
float shadowmap=1-(texCUBE(DepthMap_0,IN.ShadowMap+float3(-0.8f,-0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(0.0f,-0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(0.8f,-0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(-0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(0.0f,0.0f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(-0.8f,0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(0.0f,0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_0,IN.ShadowMap+float3(0.8f,0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
return float4(Texture*((Normal*Light*shadowmap)+Ambient),Texture.w*Alpha);
}
// L1
float4 PS_NormalMap_L1(OUT_NormalMap IN) : COLOR
{
float4 Texture=tex2D(Base,IN.Tex);
float3 NormalMap=tex2D(Normal,IN.Tex)*2-1;
float3 LightV=normalize(IN.LightVec);
float3 ViewV=normalize(IN.ViewVec);
NormalMap=normalize(NormalMap);
float Normal=saturate(dot(reflect(-ViewV,NormalMap),LightV));
Normal=pow(Normal,16)+saturate(dot(NormalMap,LightV));
float3 Light=LCol_1*(1-dot(IN.Attenuation,IN.Attenuation));
float Depth=length(IN.Attenuation);
float shadowmap=1-(texCUBE(DepthMap_1,IN.ShadowMap+float3(-0.8f,-0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(0.0f,-0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(0.8f,-0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(-0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(0.0f,0.0f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(-0.8f,0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(0.0f,0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_1,IN.ShadowMap+float3(0.8f,0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
return float4(Texture*((Normal*Light*shadowmap)),Texture.w*Alpha);
}
// L2
float4 PS_NormalMap_L2(OUT_NormalMap IN) : COLOR
{
float4 Texture=tex2D(Base,IN.Tex);
float3 NormalMap=tex2D(Normal,IN.Tex)*2-1;
float3 LightV=normalize(IN.LightVec);
float3 ViewV=normalize(IN.ViewVec);
NormalMap=normalize(NormalMap);
float Normal=saturate(dot(reflect(-ViewV,NormalMap),LightV));
Normal=pow(Normal,16)+saturate(dot(NormalMap,LightV));
float3 Light=LCol_2*(1-dot(IN.Attenuation,IN.Attenuation));
float Depth=length(IN.Attenuation);
float shadowmap=1-(texCUBE(DepthMap_2,IN.ShadowMap+float3(-0.8f,-0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(0.0f,-0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(0.8f,-0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(-0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(0.0f,0.0f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(-0.8f,0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(0.0f,0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_2,IN.ShadowMap+float3(0.8f,0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
return float4(Texture*((Normal*Light*shadowmap)),Texture.w*Alpha);
}
// L3
float4 PS_NormalMap_L3(OUT_NormalMap IN) : COLOR
{
float4 Texture=tex2D(Base,IN.Tex);
float3 NormalMap=tex2D(Normal,IN.Tex)*2-1;
float3 LightV=normalize(IN.LightVec);
float3 ViewV=normalize(IN.ViewVec);
NormalMap=normalize(NormalMap);
float Normal=saturate(dot(reflect(-ViewV,NormalMap),LightV));
Normal=pow(Normal,16)+saturate(dot(NormalMap,LightV));
float3 Light=LCol_3*(1-dot(IN.Attenuation,IN.Attenuation));
float Depth=length(IN.Attenuation);
float shadowmap=1-(texCUBE(DepthMap_3,IN.ShadowMap+float3(-0.8f,-0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(0.0f,-0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(0.8f,-0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(-0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(0.0f,0.0f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(-0.8f,0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(0.0f,0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_3,IN.ShadowMap+float3(0.8f,0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
return float4(Texture*((Normal*Light*shadowmap)),Texture.w*Alpha);
}
// L4
float4 PS_NormalMap_L4(OUT_NormalMap IN) : COLOR
{
float4 Texture=tex2D(Base,IN.Tex);
float3 NormalMap=tex2D(Normal,IN.Tex)*2-1;
float3 LightV=normalize(IN.LightVec);
float3 ViewV=normalize(IN.ViewVec);
NormalMap=normalize(NormalMap);
float Normal=saturate(dot(reflect(-ViewV,NormalMap),LightV));
Normal=pow(Normal,16)+saturate(dot(NormalMap,LightV));
float3 Light=LCol_4*(1-dot(IN.Attenuation,IN.Attenuation));
float Depth=length(IN.Attenuation);
float shadowmap=1-(texCUBE(DepthMap_4,IN.ShadowMap+float3(-0.8f,-0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(0.0f,-0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(0.8f,-0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(-0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(0.0f,0.0f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(-0.8f,0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(0.0f,0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_4,IN.ShadowMap+float3(0.8f,0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
return float4(Texture*((Normal*Light*shadowmap)),Texture.w*Alpha);
}
// L5
float4 PS_NormalMap_L5(OUT_NormalMap IN) : COLOR
{
float4 Texture=tex2D(Base,IN.Tex);
float3 NormalMap=tex2D(Normal,IN.Tex)*2-1;
float3 LightV=normalize(IN.LightVec);
float3 ViewV=normalize(IN.ViewVec);
NormalMap=normalize(NormalMap);
float Normal=saturate(dot(reflect(-ViewV,NormalMap),LightV));
Normal=pow(Normal,16)+saturate(dot(NormalMap,LightV));
float3 Light=LCol_5*(1-dot(IN.Attenuation,IN.Attenuation));
float Depth=length(IN.Attenuation);
float shadowmap=1-(texCUBE(DepthMap_5,IN.ShadowMap+float3(-0.8f,-0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(0.0f,-0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(0.8f,-0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(-0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(0.0f,0.0f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(0.8f,0.0f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(-0.8f,0.8f,0.0f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(0.0f,0.8f,0.8f)) < Depth ? 0.111f:0.0f);
shadowmap=shadowmap-(texCUBE(DepthMap_5,IN.ShadowMap+float3(0.8f,0.8f,-0.8f)) < Depth ? 0.111f:0.0f);
return float4(Texture*((Normal*Light*shadowmap)),Texture.w*Alpha);
}
//--------------
// techniques
//--------------
//--Depthmap--
// L0
technique DepthMap_L0
{
pass p1
{
VertexShader = compile vs_2_0 VS_L0();
PixelShader = compile ps_2_0 PS_L0();
}
}
// L1
technique DepthMap_L1
{
pass p1
{
VertexShader = compile vs_2_0 VS_L1();
PixelShader = compile ps_2_0 PS_L1();
}
}
// L2
technique DepthMap_L2
{
pass p1
{
VertexShader = compile vs_2_0 VS_L2();
PixelShader = compile ps_2_0 PS_L2();
}
}
// L3
technique DepthMap_L3
{
pass p1
{
VertexShader = compile vs_2_0 VS_L3();
PixelShader = compile ps_2_0 PS_L3();
}
}
// L4
technique DepthMap_L4
{
pass p1
{
VertexShader = compile vs_2_0 VS_L4();
PixelShader = compile ps_2_0 PS_L4();
}
}
// L5
technique DepthMap_L5
{
pass p1
{
VertexShader = compile vs_2_0 VS_L5();
PixelShader = compile ps_2_0 PS_L5();
}
}
//--Mapping---
technique ShadowMapping_L0
{
pass p1
{
vertexShader = compile vs_2_0 VS_NormalMap_L0();
pixelShader = compile ps_2_0 PS_NormalMap_L0();
FOGCOLOR=(FogColor);
FOGENABLE=TRUE;
}
}
technique ShadowMapping_L1
{
pass p1
{
vertexShader = compile vs_2_0 VS_NormalMap_L0();
pixelShader = compile ps_2_0 PS_NormalMap_L0();
}
pass p2
{
vertexShader = compile vs_2_0 VS_NormalMap_L1();
pixelShader = compile ps_2_0 PS_NormalMap_L1();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
FOGCOLOR=(FogColor);
FOGENABLE=TRUE;
}
}
technique ShadowMapping_L2
{
pass p1
{
vertexShader = compile vs_2_0 VS_NormalMap_L0();
pixelShader = compile ps_2_0 PS_NormalMap_L0();
}
pass p2
{
vertexShader = compile vs_2_0 VS_NormalMap_L1();
pixelShader = compile ps_2_0 PS_NormalMap_L1();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p3
{
vertexShader = compile vs_2_0 VS_NormalMap_L2();
pixelShader = compile ps_2_0 PS_NormalMap_L2();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
FOGCOLOR=(FogColor);
FOGENABLE=TRUE;
}
}
technique ShadowMapping_L3
{
pass p1
{
vertexShader = compile vs_2_0 VS_NormalMap_L0();
pixelShader = compile ps_2_0 PS_NormalMap_L0();
}
pass p2
{
vertexShader = compile vs_2_0 VS_NormalMap_L1();
pixelShader = compile ps_2_0 PS_NormalMap_L1();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p3
{
vertexShader = compile vs_2_0 VS_NormalMap_L2();
pixelShader = compile ps_2_0 PS_NormalMap_L2();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p4
{
vertexShader = compile vs_2_0 VS_NormalMap_L3();
pixelShader = compile ps_2_0 PS_NormalMap_L3();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
FOGCOLOR=(FogColor);
FOGENABLE=TRUE;
}
}
technique ShadowMapping_L4
{
pass p1
{
vertexShader = compile vs_2_0 VS_NormalMap_L0();
pixelShader = compile ps_2_0 PS_NormalMap_L0();
}
pass p2
{
vertexShader = compile vs_2_0 VS_NormalMap_L1();
pixelShader = compile ps_2_0 PS_NormalMap_L1();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p3
{
vertexShader = compile vs_2_0 VS_NormalMap_L2();
pixelShader = compile ps_2_0 PS_NormalMap_L2();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p4
{
vertexShader = compile vs_2_0 VS_NormalMap_L3();
pixelShader = compile ps_2_0 PS_NormalMap_L3();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p5
{
vertexShader = compile vs_2_0 VS_NormalMap_L4();
pixelShader = compile ps_2_0 PS_NormalMap_L4();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
FOGCOLOR=(FogColor);
FOGENABLE=TRUE;
}
}
technique ShadowMapping_L5
{
pass p1
{
vertexShader = compile vs_2_0 VS_NormalMap_L0();
pixelShader = compile ps_2_0 PS_NormalMap_L0();
}
pass p2
{
vertexShader = compile vs_2_0 VS_NormalMap_L1();
pixelShader = compile ps_2_0 PS_NormalMap_L1();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p3
{
vertexShader = compile vs_2_0 VS_NormalMap_L2();
pixelShader = compile ps_2_0 PS_NormalMap_L2();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p4
{
vertexShader = compile vs_2_0 VS_NormalMap_L3();
pixelShader = compile ps_2_0 PS_NormalMap_L3();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p5
{
vertexShader = compile vs_2_0 VS_NormalMap_L4();
pixelShader = compile ps_2_0 PS_NormalMap_L4();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
}
pass p6
{
vertexShader = compile vs_2_0 VS_NormalMap_L5();
pixelShader = compile ps_2_0 PS_NormalMap_L5();
AlphaBlendEnable = True;
SrcBlend = ONE;
DestBlend = One;
FOGCOLOR=(FogColor);
FOGENABLE=TRUE;
}
}