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

Revision 2982, 5.4 KB checked in by mattausch, 16 years ago (diff)

problematic: merging

Line 
1#include "../shaderenv.h"
2
3
4struct fragment
5{
6         // normalized screen position
7        float4 pos: WPOS;
8        float4 texCoord: TEXCOORD0;
9        float3 view: COLOR0;
10};
11
12
13struct pixel
14{
15        float4 color: COLOR0;
16};
17
18
19float2 myreflect(float2 pt, float2 n)
20{
21        // distance to plane
22        float d = dot(n, pt);
23        // reflect around plane
24        float2 rpt = pt - d * 2.0f * n;
25
26        return rpt;
27}
28
29
30/** function for standard deferred shading
31*/
32float4 shade(fragment IN,
33                         uniform float4 color,
34                         uniform float4 position,
35                         uniform float3 normal,
36                         uniform float emmisive,
37                         float3 lightDir)
38{
39        // diffuse intensity
40        const float angle = saturate(dot(normal, lightDir));
41       
42        float4 lightDiffuse = glstate.light[0].diffuse;
43        float4 diffuse = angle * lightDiffuse;
44
45        // global ambient
46        const float4 ambient = glstate.light[0].ambient;
47       
48        float4 outColor;
49
50        //if (color.w > 1e19f) outColor = color;
51        if (emmisive > 1.5f) outColor = color;
52        else outColor = (ambient + diffuse) * color;
53
54        return outColor;
55        //return saturate((((ambient + diffuse)) * (1.0f - emmisive) + emmisive) * color);
56}
57
58
59
60/** The mrt shader for standard rendering
61*/
62pixel main(fragment IN,
63                   uniform sampler2D colors,
64                   uniform sampler2D positions,
65                   uniform sampler2D normals,
66                   uniform float3 lightDir,
67                   uniform sampler2D oldColors
68                   )
69{
70        pixel OUT;
71
72        float4 norm = tex2D(normals, IN.texCoord.xy);
73        float4 color = tex2Dlod(colors, float4(IN.texCoord.xy, 0, 0));
74        float4 position = tex2D(positions, IN.texCoord.xy);
75
76        // an ambient color term
77        float amb = color.w;
78
79        float3 normal = normalize(norm.xyz);
80
81        float4 col = shade(IN, color, position, normal, amb, lightDir);
82       
83        OUT.color = col;
84       
85
86        ////////////
87        //-- write out logaritmic luminance for tone mapping
88
89        float4 oldColor = tex2Dlod(colors, float4(IN.texCoord.xy, 0, MAX_LOD_LEVEL));
90
91        const float3 w = float3(0.299f, 0.587f, 0.114f);
92
93        float lum = dot(OUT.color.rgb, w);
94        float logLum = log(1e-5f + lum);
95
96        float logLumOffset = MINLOGLUM * INV_LOGLUM_RANGE;
97        float logLumScaled = logLum * INV_LOGLUM_RANGE - logLumOffset;
98
99        if (oldColor.w > 0)
100                OUT.color.w = lerp(oldColor.w, logLumScaled, 0.1f);
101        else
102                OUT.color.w = logLumScaled;
103
104        return OUT;
105}
106
107
108float CalcShadowTerm(fragment IN,
109                                         uniform sampler2D shadowMap,
110                                         uniform float w,
111                                         uniform float2 lightSpacePos,
112                                         uniform float depth,
113                                         uniform float2 samples[NUM_PCF_TABS],
114                                         uniform sampler2D noiseTexture
115                                         )
116{
117        //float shadowDepth = tex2D(shadowMap, lightSpacePos).x;
118        //return step(depth, shadowDepth);
119
120        float total_d = 0.0;
121       
122        for (int i = 0; i < NUM_PCF_TABS; ++ i)
123        {
124                const float2 offset = samples[i];
125
126#if 1
127                ////////////////////
128                //-- add random noise: reflect around random normal vector (warning: slow!)
129
130                float2 mynoise = tex2D(noiseTexture, IN.texCoord.xy).xy;
131                const float2 offsetTransformed = myreflect(offset, mynoise);
132#else
133                const float2 offsetTransformed = offset;
134#endif
135                // weight with projected coordinate to reach similar kernel size for near and far
136                float2 texcoord = lightSpacePos + offsetTransformed * w;
137
138                float shadowDepth = tex2D(shadowMap, texcoord).x;
139
140                total_d += step(depth, shadowDepth);
141        }
142
143        total_d /= (float)NUM_PCF_TABS;
144
145        return total_d;
146}
147
148
149pixel main_shadow(fragment IN,
150                                  uniform sampler2D colors,
151                                  uniform sampler2D positions,
152                                  uniform sampler2D normals,               
153                                  uniform sampler2D shadowMap,
154                                  uniform float4x4 shadowMatrix,
155                                  uniform float maxDepth,
156                                  uniform float sampleWidth,
157                                  uniform sampler2D noiseTexture,
158                                  uniform float2 samples[NUM_PCF_TABS],
159                                  uniform float3 lightDir,
160                                  uniform sampler2D oldColors
161                                  )
162{
163        pixel OUT;
164
165        float4 norm = tex2D(normals, IN.texCoord.xy);
166        float4 color = tex2Dlod(colors, float4(IN.texCoord.xy, 0, 0));
167        float4 position = tex2D(positions, IN.texCoord.xy);
168       
169        const float3 normal = normalize(norm.xyz);
170       
171        // hack: an emmisive color term
172        float emmisive = color.w;
173
174        // diffuse intensity
175        const float angle = saturate(dot(normal, lightDir));
176        //float4 lightDiffuse = float4(1.0f, 1.0f, 0.9f, 1.0f);
177        const float4 lightDiffuse = glstate.light[0].diffuse;
178        //float4(1.0f, 1.0f, 0.9f, 1.0f);
179
180        float4 diffuse = lightDiffuse * angle;
181
182        // calc diffuse illumination + shadow term
183        if ((emmisive < 1.5f) // hack: prevent shadowing the sky       
184                && (angle > 1e-3f) // shadow only if diffuse color has some minimum intensity
185                )
186        {
187                position *= maxDepth;
188                position.w = 1.0f;
189
190                float4 lightSpacePos = mul(shadowMatrix, position);
191                lightSpacePos /= lightSpacePos.w;
192
193                float shadowTerm = CalcShadowTerm(IN, shadowMap, sampleWidth, lightSpacePos.xy, lightSpacePos.z, samples, noiseTexture);
194
195                diffuse *= shadowTerm;
196        }
197
198        // light ambient term
199        const float4 ambient = glstate.light[0].ambient;
200       
201        // base lighting
202        OUT.color = (emmisive > 1.5f) ? color: (ambient + diffuse) * color;
203
204
205        ////////////
206        //-- write out logaritmic luminance for tone mapping
207
208        float4 oldColor = tex2Dlod(colors, float4(IN.texCoord.xy, 0, MAX_LOD_LEVEL));
209
210        const float3 w = float3(0.299f, 0.587f, 0.114f);
211
212        float lum = dot(OUT.color.rgb, w);
213        float logLum = log(1e-5f + lum);
214
215        float logLumOffset = MINLOGLUM * INV_LOGLUM_RANGE;
216        float logLumScaled = logLum * INV_LOGLUM_RANGE - logLumOffset;
217
218        if (oldColor.w > 0)
219                OUT.color.w = lerp(oldColor.w, logLumScaled, 0.1f);
220        else
221                OUT.color.w = logLumScaled;
222       
223        return OUT;
224}
225
Note: See TracBrowser for help on using the repository browser.