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

Revision 2928, 4.2 KB checked in by mattausch, 16 years ago (diff)
Line 
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);
26        //float4 lightDir = float4(0.0f, 1.0f, 0.0f, 0.0f);
27        float4 lightDir2 = float4(-0.5f, 0.5f, 0.4f, 0.0f);
28
29        // global ambient
30        const float4 ambient = 0.25f;
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*/
48pixel main(fragment IN,
49                   uniform sampler2D colors,
50                   uniform sampler2D positions,
51                   uniform sampler2D normals   
52                   )
53{
54        pixel OUT;
55
56        float4 norm = tex2D(normals, IN.texCoord.xy);
57        float4 color = tex2Dlod(colors, float4(IN.texCoord.xy, 0, 0));
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;
73}
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,
82                                  uniform float4x4 shadowMatrix,
83                                  uniform float maxDepth,
84                                  uniform float sampleWidth
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       
100        position *= maxDepth;
101        position.w = 1.0f;
102       
103        float4 lightSpacePos = mul(shadowMatrix, position);
104        lightSpacePos /= lightSpacePos.w;
105
106        float shadowDepth[9];
107
108        float w = sampleWidth;
109
110        // pcf sampling using 3 x 3 tab
111
112        shadowDepth[0] = tex2D(shadowMap, lightSpacePos.xy).x;
113       
114        shadowDepth[1] = tex2D(shadowMap, lightSpacePos.xy + float2( w,  w)).x;
115        shadowDepth[2] = tex2D(shadowMap, lightSpacePos.xy - float2( w, -w)).x;
116        shadowDepth[3] = tex2D(shadowMap, lightSpacePos.xy - float2(-w, -w)).x;
117        shadowDepth[4] = tex2D(shadowMap, lightSpacePos.xy - float2(-w,  w)).x;
118
119        shadowDepth[5] = tex2D(shadowMap, lightSpacePos.xy - float2( w,  0)).x;
120        shadowDepth[6] = tex2D(shadowMap, lightSpacePos.xy - float2( 0,  w)).x;
121        shadowDepth[7] = tex2D(shadowMap, lightSpacePos.xy - float2(-w,  0)).x;
122        shadowDepth[8] = tex2D(shadowMap, lightSpacePos.xy - float2( 0, -w)).x;
123
124        OUT.color = col;
125       
126        float depth = lightSpacePos.z;
127
128        float d = 0.0f;
129
130        for (int i = 0; i < 9; ++ i)
131        {
132                d += step(shadowDepth[i], depth);
133        }
134
135        d /= 9.0f;
136       
137        /*if ((amb < 0.9) && // hack: prevent shadowing the sky
138                (lightSpacePos.z / lightSpacePos.w > shadowDepth))
139        {
140                OUT.color *= 0.1f;
141        }*/
142       
143        if (amb < 0.9) // hack: prevent shadowing the sky       
144        {
145                const float x = 0.1f;
146                OUT.color *= x + (1.0f - x) * (1.0f - d);
147        }
148       
149        //OUT.color = lightSpacePos;//float4(lightSpacePos.z / lightSpacePos.w);
150        //OUT.color = float4(shadowDepth);
151        OUT.color.w = color.w;
152
153        return OUT;
154}
155
156
157/** The mrt shader for standard rendering
158*/
159pixel main_shadow_debug(fragment IN,
160                                                uniform sampler2D shadowMap,
161                                                uniform sampler2D colorTex,
162                                                uniform float4x4 shadowMatrix)
163{
164        pixel OUT;
165#if 0
166        // visualize depth
167        OUT.color = tex2Dlod(colorTex, float4(IN.texCoord.xy, 0, 0));
168#else
169        float4 col;
170        col = tex2Dlod(shadowMap, float4(IN.texCoord.xy, 0, 0));
171        OUT.color = float4(col.z / col.w, 0, 0, 1);
172#endif
173        return OUT;
174}
Note: See TracBrowser for help on using the repository browser.