1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| //--------------------------------------------------------------------------------------
// Origial File: ShadowVolume.fx
// Modified: StencilShadow.fx
//--------------------------------------------------------------------------------------
// DBPro Specific until DXSAS (U6)
float3 g_vLightView : POINTLIGHT;
float4x4 g_mWorld : WORLD;
float4x4 g_mViewProjection : VIEWPROJECTION;
float4x4 g_mWorldViewProjection : WORLDVIEWPROJECTION;
float g_mShadowRange : MESHRADIUS;
// Shader Code
void VertShadowVolume( float4 vPos : POSITION,
float3 vNormal : NORMAL,
out float4 oPos : POSITION )
{
float4 PosView = mul( vPos, g_mWorld );
float3 LightVec = PosView.xyz - g_vLightView;
float3 N = mul( vNormal, (float3x3)g_mWorld );
// Extrude quad vertex if normal faces away from light
LightVec = normalize ( LightVec );
if( dot( N, -LightVec ) < 0.0f )
{
// stretch out
PosView.x += LightVec.x * g_mShadowRange;
PosView.y += LightVec.y * g_mShadowRange;
PosView.z += LightVec.z * g_mShadowRange;
}
else
{
// defeat self-shadow zclash
PosView.x += LightVec.x*3.0f;
PosView.y += LightVec.y*3.0f;
PosView.z += LightVec.z*3.0f;
}
oPos = mul( PosView, g_mViewProjection );
}
//--------------------------------------------------------------------------------------
// Techniques
//--------------------------------------------------------------------------------------
technique RenderShadowVolume
{
//Main DBP technique
/*pass P0
{
VertexShader = compile vs_1_1 VertShadowVolume();
StencilPass = Keep;
StencilZFail = Incr;
CullMode = CCW;
}
pass P1
{
VertexShader = compile vs_1_1 VertShadowVolume();
CullMode = Cw;
StencilZFail = Decr;
}*/
//My mod technique
pass p0
{
ZEnable = true;
ZWriteEnable = true;
ZFunc = lessequal;
CULLMODE = CW;
STENCILENABLE = TRUE;
STENCILPASS = DecrSat;
STENCILZFAIL = KEEP;
ZWRITEENABLE = FALSE;
COLORWRITEENABLE = 0;
VertexShader = compile vs_2_0 VertShadowVolume();
}
pass p1
{
ZEnable = true;
ZWriteEnable = true;
ZFunc = lessequal;
CULLMODE = CCW;
STENCILENABLE = TRUE;
STENCILPASS = INCRsat;
STENCILZFAIL = KEEP;
STENCILFUNC = ALWAYS;
ZWRITEENABLE = FALSE;
COLORWRITEENABLE = 0;
VertexShader = compile vs_2_0 VertShadowVolume();
}
} |
Partager