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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
matrix mWorldViewProj;
matrix mLightViewProj;
Texture2D ColorDef;
Texture2D Layer1;
Texture2D Layer2;
Texture2D Layer3;
Texture2D Layer4;
Texture2D ShadowTex;
float fShadMapSize = 512.0f;
SamplerState linearSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
shared RasterizerState noCullRS
{
CullMode = None;
FillMode = Solid;
MultisampleEnable = false;
};
/*************************************************************
Colored,Shaded Terrain
*************************************************************/
struct a2v_Shaded {
float4 Pos : POSITION;
float2 TexCoord : TEXCOORD0;
float2 DetailCoord : TEXCOORD1;
};
struct v2p_Shaded {
float4 Pos : SV_POSITION;
float2 TexCoord : TEXCOORD0;
float2 DetailCoord : TEXCOORD1;
float4 lightViewPos : LIGHT;
};
void VS_Shaded( in a2v_Shaded IN, out v2p_Shaded OUT) {
float4 Pos = IN.Pos;
OUT.Pos = mul(Pos,mWorldViewProj);
OUT.TexCoord = IN.TexCoord;
OUT.DetailCoord = IN.DetailCoord;
OUT.lightViewPos = mul(Pos,mLightViewProj);
}
float4 ComputeColor( in v2p_Shaded IN)
{
float4 ColorAlpha = ColorDef.Sample(linearSampler,IN.TexCoord);
float4 Color1 = Layer1.Sample(linearSampler,IN.DetailCoord);
float4 Color2 = Layer2.Sample(linearSampler,IN.DetailCoord);
float4 Color3 = Layer3.Sample(linearSampler,IN.DetailCoord);
float4 Color4 = Layer4.Sample(linearSampler,IN.DetailCoord);
return (Color1 * ColorAlpha.r) + (Color2 * ColorAlpha.g) + (Color3 * ColorAlpha.b) + (Color4 * ColorAlpha.a);
}
float4 PS_Shaded( in v2p_Shaded IN): SV_Target
{
float4 lightViewPos = IN.lightViewPos;
lightViewPos.xy /= lightViewPos.w;
float2 tex = lightViewPos.xy * float2( 0.5f, -0.5f ) + 0.5f;
float fA = lightViewPos.z/lightViewPos.w;
float fShad = 0.0f;
for(int x=-1;x<2;x++)
for(int y=-1;y<2;y++)
{
fB = ShadowTex.Sample(linearSampler,tex.xy + float2(x/fShadMapSize,y/fShadMapSize)).r;
if( ((fA-0.0001) <= fB))
fShad += 1.0f;
}
fShad /= 9.0f;
return ComputeColor(IN) * fShad;
}
technique10 Shaded
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS_Shaded() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS_Shaded() ) );
SetRasterizerState( noCullRS );
}
}
/*************************************************************
Shadow
*************************************************************/
struct a2v_Shadow {
float4 Pos : POSITION;
float2 TexCoord : TEXCOORD0;
float2 DetailCoord : TEXCOORD1;
};
struct v2p_Shadow {
float4 Pos : SV_POSITION;
float4 Light : LIGHT;
};
void VS_Shadow( in a2v_Shadow IN, out v2p_Shadow OUT) {
OUT.Pos = mul(IN.Pos,mLightViewProj);
OUT.Light = mul(IN.Pos,mLightViewProj);
}
float4 PS_Shadow( in v2p_Shadow IN): SV_Target
{
float fDepth = IN.Light.z/IN.Light.w;
return float4(fDepth,fDepth,fDepth,1.0f);
}
technique10 Shadow
{
pass P0
{
SetVertexShader( CompileShader( vs_4_0, VS_Shadow() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, PS_Shadow() ) );
SetRasterizerState( noCullRS );
}
}
|