source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/deferred.cg @ 2895

Revision 2895, 3.7 KB checked in by mattausch, 16 years ago (diff)
RevLine 
[2876]1struct fragment
2{
3         // normalized screen position
4        float4 pos: WPOS;
5        float4 texCoord: TEXCOORD0;
6        float3 view: COLOR0;
7};
8
9
10struct pixel
11{
12        float4 color: COLOR0;
13};
14
15
16
17/** function for standard deferred shading
18*/
19float4 shade(fragment IN,
20                         uniform float4 color,
21                         uniform float4 position,
22                         uniform float3 normal,
23                         uniform float amb)
24{
25        float4 lightDir = float4(0.8f, -1.0f, 0.7f, 0.0f);
[2887]26        //float4 lightDir = float4(0.0f, 1.0f, 0.0f, 0.0f);
[2876]27        float4 lightDir2 = float4(-0.5f, 0.5f, 0.4f, 0.0f);
28
29        // global ambient
[2882]30        const float4 ambient = 0.25f;
[2876]31
32        // float3 L = normalize(lightPosition - position);
33        float3 light = normalize(lightDir.xyz);
34        float3 light2 = normalize(lightDir2.xyz);
35
36        float diffuseLight = saturate(dot(normal, light));
37        float diffuseLight2 = saturate(dot(normal, light2));
38
39        float diffuse = diffuseLight + diffuseLight2;
40
41        return (ambient + diffuse) * color * (1.0f - amb) + amb * color;
42}
43
44
45
46/** The mrt shader for standard rendering
47*/
[2874]48pixel main(fragment IN,
49                   uniform sampler2D colors,
50                   uniform sampler2D positions,
[2892]51                   uniform sampler2D normals   
[2874]52                   )
53{
54        pixel OUT;
55
56        float4 norm = tex2D(normals, IN.texCoord.xy);
[2884]57        float4 color = tex2Dlod(colors, float4(IN.texCoord.xy, 0, 0));
[2874]58        float4 position = tex2D(positions, IN.texCoord.xy);
59
60        // an ambient color term
61        float amb = norm.w;
62
63        // expand normal
64        float3 normal = normalize(norm.xyz);// * 2.0f - float4(1.0f));
65
66        float4 col = shade(IN, color, position, normal, amb);
67       
68        //OUT.color = float4(1.0f);
69        OUT.color = col;
70        OUT.color.w = color.w;
71
72        return OUT;
[2876]73}
[2892]74
75/** The mrt shader for standard rendering
76*/
77pixel main_shadow(fragment IN,
78                                  uniform sampler2D colors,
79                                  uniform sampler2D positions,
80                                  uniform sampler2D normals,               
81                                  uniform sampler2D shadowMap,
[2893]82                                  uniform float4x4 shadowMatrix,
[2895]83                                  uniform float maxDepth,
84                                  uniform float sampleWidth
[2892]85                                  )
86{
87        pixel OUT;
88
89        float4 norm = tex2D(normals, IN.texCoord.xy);
90        float4 color = tex2Dlod(colors, float4(IN.texCoord.xy, 0, 0));
91        float4 position = tex2D(positions, IN.texCoord.xy);
92
93
94        // an ambient color term
95        float amb = norm.w;
96
97        float3 normal = normalize(norm.xyz);
98        float4 col = shade(IN, color, position, normal, amb);
99       
[2893]100        position *= maxDepth;
101        position.w = 1.0f;
102       
103        float4 lightSpacePos = mul(shadowMatrix, position);
104
[2895]105        float shadowDepth[9];
[2893]106
[2895]107        float w = sampleWidth;
108
109        // pcf sampling using 3 x 3 tab
110
111        shadowDepth[0] = tex2D(shadowMap, lightSpacePos.xy).x;
112       
113        shadowDepth[1] = tex2D(shadowMap, lightSpacePos.xy + float2( w,  w)).x;
114        shadowDepth[2] = tex2D(shadowMap, lightSpacePos.xy - float2( w, -w)).x;
115        shadowDepth[3] = tex2D(shadowMap, lightSpacePos.xy - float2(-w, -w)).x;
116        shadowDepth[4] = tex2D(shadowMap, lightSpacePos.xy - float2(-w,  w)).x;
117
118        shadowDepth[5] = tex2D(shadowMap, lightSpacePos.xy - float2( w,  0)).x;
119        shadowDepth[6] = tex2D(shadowMap, lightSpacePos.xy - float2( 0,  w)).x;
120        shadowDepth[7] = tex2D(shadowMap, lightSpacePos.xy - float2(-w,  0)).x;
121        shadowDepth[8] = tex2D(shadowMap, lightSpacePos.xy - float2( 0, -w)).x;
122
[2892]123        OUT.color = col;
124       
[2895]125        float depth = lightSpacePos.z / lightSpacePos.w;
126
127        float d = 0.0f;
128
129        for (int i = 0; i < 9; ++ i)
130        {
131                d += step(shadowDepth[i], depth);
132        }
133
134        d /= 9.0f;
135       
136        /*if ((amb < 0.9) && // hack: prevent shadowing the sky
[2893]137                (lightSpacePos.z / lightSpacePos.w > shadowDepth))
[2892]138        {
139                OUT.color *= 0.1f;
[2895]140        }*/
141       
142        if (amb < 0.9) // hack: prevent shadowing the sky       
143        {
144                const float x = 0.1f;
145                OUT.color *= x + (1.0f - x) * (1.0f - d);
[2892]146        }
147       
[2893]148        //OUT.color = lightSpacePos;//float4(lightSpacePos.z / lightSpacePos.w);
[2892]149        //OUT.color = float4(shadowDepth);
150        OUT.color.w = color.w;
151
152        return OUT;
153}
Note: See TracBrowser for help on using the repository browser.