1 | ///////depth map
|
---|
2 | struct VS_OUT
|
---|
3 | {
|
---|
4 | float4 hPosition : POSITION;
|
---|
5 | float4 Position : TEXCOORD0;
|
---|
6 | };
|
---|
7 |
|
---|
8 | VS_OUT hDepthVS(float4 position : POSITION,
|
---|
9 | uniform float4x4 worldView,
|
---|
10 | uniform float4x4 worldViewProj)
|
---|
11 | {
|
---|
12 |
|
---|
13 | VS_OUT OUT;
|
---|
14 | OUT.hPosition = mul(worldViewProj, position);
|
---|
15 | OUT.Position = mul(worldView, position);
|
---|
16 | OUT.Position.z *= -1.0;
|
---|
17 | return OUT;
|
---|
18 | }
|
---|
19 |
|
---|
20 |
|
---|
21 |
|
---|
22 | float4 DepthPS(VS_OUT IN ):COLOR
|
---|
23 | {
|
---|
24 | float dist = length(IN.Position.xyz);
|
---|
25 | return float4(dist, dist, dist, 1);
|
---|
26 | }
|
---|
27 |
|
---|
28 | ///////////////Shadow
|
---|
29 |
|
---|
30 | struct VS_OUT_SHADOW
|
---|
31 | {
|
---|
32 | float4 hPosition : POSITION;
|
---|
33 | float4 Position : TEXCOORD0;
|
---|
34 | float4 cPosition : TEXCOORD1;
|
---|
35 | };
|
---|
36 |
|
---|
37 | VS_OUT_SHADOW depthShadowVS(float4 position : POSITION,
|
---|
38 | uniform float4x4 world,
|
---|
39 | uniform float4x4 worldView,
|
---|
40 | uniform float4x4 worldViewProj)
|
---|
41 | {
|
---|
42 | VS_OUT_SHADOW OUT;
|
---|
43 | OUT.hPosition = mul(worldViewProj, position);
|
---|
44 | OUT.Position = mul(world, position);
|
---|
45 | OUT.cPosition = mul(worldView, position);
|
---|
46 | return OUT;
|
---|
47 | }
|
---|
48 |
|
---|
49 |
|
---|
50 | float4 depthShadowPS(VS_OUT_SHADOW IN,
|
---|
51 | uniform float4x4 lightView,
|
---|
52 | uniform float4x4 lightViewProj,
|
---|
53 | uniform float4x4 lightView2,
|
---|
54 | uniform float4x4 lightViewProj2,
|
---|
55 | uniform sampler2D depthShadowMap : register(s0),
|
---|
56 | uniform sampler2D depthShadowMap2 : register(s1)):COLOR
|
---|
57 | {
|
---|
58 | float bias = 0.06;
|
---|
59 | float4 shadowColor = float4(0.6, 0.6, 0.6, 1.0);
|
---|
60 |
|
---|
61 | float4 light1 = 1;
|
---|
62 | float4 light2 = 1;
|
---|
63 | float weight1 = 1;
|
---|
64 | float weight2 = 1;
|
---|
65 |
|
---|
66 | float4 lightCamPos1 = mul(lightView, IN.Position);
|
---|
67 | float d1 = length(lightCamPos1.xyz);
|
---|
68 | float4 lightScreenPos1 = mul(lightViewProj, IN.Position);
|
---|
69 | lightScreenPos1 = lightScreenPos1 / lightScreenPos1.w ;
|
---|
70 | lightScreenPos1 = ( lightScreenPos1 + 1.0 ) / 2.0;
|
---|
71 | lightScreenPos1.y = 1.0 - lightScreenPos1.y;
|
---|
72 | float4 storedDepth1 = tex2D(depthShadowMap, lightScreenPos1.xy);
|
---|
73 | if(storedDepth1.r + bias < d1)
|
---|
74 | light1=0;
|
---|
75 |
|
---|
76 |
|
---|
77 | float4 lightCamPos2 = mul(lightView2, IN.Position);
|
---|
78 | float d2 = length(lightCamPos2.xyz);
|
---|
79 |
|
---|
80 |
|
---|
81 | float4 lightScreenPos2 = mul(lightViewProj2, IN.Position);
|
---|
82 | lightScreenPos2 = lightScreenPos2 / lightScreenPos2.w ;
|
---|
83 |
|
---|
84 | if(abs(lightScreenPos2.x) < 0.99 && abs(lightScreenPos2.y) < 0.99 )
|
---|
85 | {
|
---|
86 | lightScreenPos2 = ( lightScreenPos2 + 1.0 ) / 2.0;
|
---|
87 | lightScreenPos2.y = 1.0 - lightScreenPos2.y;
|
---|
88 | float4 storedDepth2 = tex2D(depthShadowMap2, lightScreenPos2.xy);
|
---|
89 | if(storedDepth2.r + bias < d2)
|
---|
90 | light2=0;
|
---|
91 | }
|
---|
92 | else
|
---|
93 | weight2 = 0;
|
---|
94 |
|
---|
95 | weight1 = 1 - weight2;
|
---|
96 |
|
---|
97 | return saturate((light1*weight1 + light2*weight2) + shadowColor);
|
---|
98 | }
|
---|
99 |
|
---|