|
透明的地方,出来阴影,阴影的地方反而没有
文件和图
float4x4 g_mViewProj;
float4x4 g_mWorld;
struct Mtrl
{
float4 ambient;
float4 diffuse;
float4 spec;
float specPower;
};
float4 pack(float fDist)
{
const float4 bitSh = float4( 256*256*256, 256*256, 256, 1);
const float4 bitMsk = float4( 0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
float4 comp;
comp = fDist * bitSh;
comp = frac(comp);
comp -= comp.xxyz * bitMsk;
return float4(comp.x, comp.y, comp.z, comp.w);
}
float unpack(sampler2D ShadowMapS, float2 texcood)
{
const float4 bitShifts = float4(1.f/(256.f*256.f*256.f), 1.f/(256.f * 256.f), 1.f/256.f, 1.f);
float4 vec = tex2D(ShadowMapS, texcood);
return dot(vec.xyzw , bitShifts);
}
inline float texFloat(sampler2D tex, float2 texCood)
{
return unpack(tex, texCood);
}
//////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
float3 g_vLightDir;
float3 g_vLightColor;
float3 g_vAmbient;
float g_fShadowMapSize;
float g_fShadowMapTexelSize;
static const int g_iNumSplits = 4;
float4x4 g_mTextureMatrix[g_iNumSplits];
float4x4 g_mView;
float g_fSplitPlane[g_iNumSplits];
sampler2D g_samShadowMap[g_iNumSplits];
uniform extern texture skinTex;
uniform extern Mtrl gMtrl;
uniform extern texture shadowTexture;
sampler2D skinSampler = sampler_state
{
Texture = <skinTex>;
MinFilter =Linear;
MagFilter =Linear;
MipFilter = Point;
AddressU = WRAP;
AddressV = WRAP;
};
void VS_RenderShadowMap(
float2 tex0 : TEXCOORD0,
in float4 vPos : POSITION,
out float4 vPosOut : POSITION,
out float4 vPixelOut : TEXCOORD1,
out float2 tex1 : TEXCOORD0
)
{
// transform vertex
vPosOut = mul(vPos, g_mWorld);
vPosOut = mul(vPosOut, g_mViewProj);
// output position to pixel shader
vPixelOut = vPosOut;
tex1=tex0;
}
float4 PS_RenderShadowMap(float4 vPixelPos : TEXCOORD1,float2 tex1 : TEXCOORD0): COLOR
{
float a = tex2D(skinSampler, tex1).a;
float f = clamp(vPixelPos.z / vPixelPos.w , 0.f, 1.f);
float4 val=pack(f);
if(a < 0.5)
val.a = 0.0f;
else
val.a = 1.0f;
return val;
}
// This technique is used when rendering meshes to the shadowmap
//
technique RenderShadowMap
{
pass p0
{
// CullMode = CW;
VertexShader = compile vs_2_0 VS_RenderShadowMap();
PixelShader = compile ps_2_0 PS_RenderShadowMap();
}
}
//////////////////////////////////////////////////////////////////
// Helper functions:
float SamplePCF(sampler2D sam, float4 vTexCoord)
{
// project texture coordinates
vTexCoord.xyz /= vTexCoord.w;
// 2x2 PCF Filtering
//
float fShadow[4];
//tex2D
fShadow[0] = (vTexCoord.z < texFloat(sam, vTexCoord + float2( 0, 0)));
fShadow[1] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(g_fShadowMapTexelSize, 0)));
fShadow[2] =(vTexCoord.z < texFloat(sam, vTexCoord + float2( 0, g_fShadowMapTexelSize)));
fShadow[3] =(vTexCoord.z < texFloat(sam, vTexCoord + float2(g_fShadowMapTexelSize, g_fShadowMapTexelSize)));
float2 vLerpFactor = frac(g_fShadowMapSize * vTexCoord.xy);
return lerp( lerp(fShadow[0], fShadow[1], vLerpFactor.x),
lerp(fShadow[2], fShadow[3], vLerpFactor.x),
vLerpFactor.y);
}
float3 GouradShading(float3 vNormal)
{
return g_vLightColor * saturate(dot(-g_vLightDir, normalize(mul(vNormal, (float3x3)g_mWorld))));
}
//////////////////////////////////////////////////////////////////
//
// Multi-pass
void VS_RenderShadows_MP(
in float2 texCoord : TEXCOORD0,
in float4 vPos : POSITION,
in float3 vNormal : NORMAL,
in float3 vColorIn : COLOR0,
out float4 vPosOut : POSITION,
out float4 vTexCoord : TEXCOORD4,
out float3 vLighting : COLOR0,
out float2 outTexCoord : TEXCOORD0,
out float3 vColorOut : COLOR1)
{
// calculate world position
float4 vPosWorld = mul(vPos, g_mWorld);
// transform vertex
vPosOut = mul(vPosWorld, g_mViewProj);
// coordinates for shadow map
vTexCoord = mul(vPosWorld, g_mTextureMatrix[0]);
// calculate per vertex lighting
vLighting = GouradShading(vNormal);
vColorOut = vColorIn;
outTexCoord = texCoord;
}
float4 PS_RenderShadows_MP(
float2 texCoord : TEXCOORD0,
float4 vTexCoord : TEXCOORD4,
float3 vLighting : COLOR0,
float3 vColorIn : COLOR1) : COLOR
{
float fLightingFactor = SamplePCF(g_samShadowMap[0], vTexCoord);
// float fLightingFactor =SamplePCF(shadowSampler, vTexCoord);
float4 texColor = tex2D(skinSampler,texCoord);
// final color
float4 vColor=1;
vColor.rgb = ( texColor) * saturate( g_vAmbient.xyz*gMtrl.ambient +vLighting.xyz*gMtrl.diffuse*(fLightingFactor)).rgb;
return float4(vColor.rgb,gMtrl.ambient.a*gMtrl.diffuse.a*texColor.a);
}
float4 PS_RenderShadows_MP2(
float4 vTexCoord : TEXCOORD4,
float3 vLighting : COLOR0,
float3 vColorIn : COLOR1) : COLOR
{
return SamplePCF(g_samShadowMap[0], vTexCoord);
}
// This technique is used to render the final shadowed meshes
//
technique RenderShadows_MP
{
pass p0
{
CullMode = CCW;
AlphaFunc = GreaterEqual;
AlphaTestEnable = true;
AlphaRef = 150;
VertexShader = compile vs_2_0 VS_RenderShadows_MP();
PixelShader = compile ps_2_0 PS_RenderShadows_MP();
}
} |
|