source: GTP/trunk/App/Demos/Illum/Ogre/Media/materials/GTPBasic/GTPShadowAccum.hlsl @ 2190

Revision 2190, 2.0 KB checked in by szirmay, 17 years ago (diff)
Line 
1#define BiasSlope 2.0
2#define LightSize 2.0
3#define Bias 0.05
4#define KernelSize 9.0
5#define LightFov 3.14 * 0.5
6#define ShadowIntensity 0.8
7#define SHADOWMAP_SIZE 512.0f
8
9#define shadowColor float4(0.2,0.2,0.2,1)
10
11uniform sampler2D ShadowMap: register(s0);
12struct LightCPos_OUT
13{
14 float4 VPos : POSITION;
15 float4 LightVPos : TEXCOORD0;
16 float4 LightCPos : TEXCOORD1;
17};
18
19
20float4 ShadowAccum_PS( LightCPos_OUT IN) : COLOR
21{
22        IN.LightCPos.z *= -1;
23        //return float4(IN.LightCPos.xyz,1);
24       
25        float R = max( LightSize, 0.1h );
26        //BiasSlope = max( BiasSlope, 0.1h );
27        float n = R;
28        float mapsize = 2 * n * tan( LightFov / 2.0f );         // size of shadow map in world space
29        float Deltal = mapsize / SHADOWMAP_SIZE;                                // size of a lexel edge in world space
30       
31        float3 r = IN.LightCPos.xyz;                                                    // shaded point in light's camera space
32        float RR =  R * (r.z - n) / r.z;                                        // directional set in which the light is seen from the shaded point
33        float step = RR / KernelSize;
34        float RR2 = RR * RR;
35        float2 q = r.xy * n / r.z;                                                      // projection of r onto the shadow plane
36        float2 quv = q / mapsize;                       
37        quv = float2( ( 0.5 + quv.x ), ( 0.5 - quv.y ) );       // r in texture coordinates
38       
39        //return (r.z - tex2D( ShadowMap, quv).r);
40        float shadow = 0;
41        for ( int i = 0; i < KernelSize; i++ )
42        {
43                for ( int j = 0; j < KernelSize; j++ )
44                {
45                        float2 uvoffset = float2( i - KernelSize / 2.0f, j - KernelSize / 2.0f ) * step /  SHADOWMAP_SIZE;
46                        float2 l = q + float2( uvoffset.x, -uvoffset.y ) * mapsize;
47                        float cz = tex2D( ShadowMap, quv + uvoffset ).x;
48                        float size = (r.z - n)/(r.z - cz) * cz / n;
49
50                        float2 lc = (n - cz)/(r.z - cz) * r.xy + size * l.xy;
51                        if( cz < r.z - Bias && dot(lc - q, lc - q) < RR2 + BiasSlope )
52                                shadow += size * size;
53                       
54                        //if( cz < r.z - Bias)
55                        //  shadow++;
56                }
57        }
58        //shadow /= KernelSize * KernelSize;
59        shadow *= Deltal * Deltal / RR2;
60        //shadow = saturate(shadow);
61        return 1;
62        return shadowColor + (1 - shadowColor) * (1 - shadow);
63}
Note: See TracBrowser for help on using the repository browser.