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
|
float CalculatePixelBrightnessFromShadowMapCube(float3 inObjPos, float3 vPosLight)
{
float output = 0.0f;
float3 PLightDirection = 0.0f;
PLightDirection.xyz = (vPosLight.xyz - inObjPos);
float distance = length(PLightDirection.xyz);
PLightDirection.xyz = PLightDirection.xyz / distance;
if(g_bPCF)
{
float sourcevals[9];
float dxy = 1.0/SMAP_SIZE;
sourcevals[0] = (texCUBE( depthMapCube, -(PLightDirection.xyz) ).x < distance)? 0.0f: 1.0f;
sourcevals[1] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(dxy, 0, 0)) ).x < distance)? 0.0f: 1.0f;
sourcevals[2] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(0, dxy, 0)) ).x < distance)? 0.0f: 1.0f;
sourcevals[3] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(dxy, dxy, 0)) ).x < distance)? 0.0f: 1.0f;
sourcevals[4] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(-dxy, 0, 0)) ).x < distance)? 0.0f: 1.0f;
sourcevals[5] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(0, -dxy, 0)) ).x < distance)? 0.0f: 1.0f;
sourcevals[6] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(-dxy, dxy, 0)) ).x < distance)? 0.0f: 1.0f;
sourcevals[7] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(-dxy, -dxy, 0)) ).x < distance)? 0.0f: 1.0f;
sourcevals[8] = (texCUBE( depthMapCube, -(PLightDirection.xyz + float3(dxy, -dxy, 0)) ).x < distance)? 0.0f: 1.0f;
float LightAmount = 0;
for(int i = 0; i < 9; i++)
{
LightAmount += sourcevals[i];
}
LightAmount /= 9.0f;
return LightAmount;
}
else
{
float shadowMapDepth = texCUBE( depthMapCube, -(PLightDirection.xyz) ).x;
if(distance > shadowMapDepth+0.0f)
{
return output;
}
else
{
return 1.0f;
}
}
|