source: GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/combineSsao.cg @ 3285

Revision 3285, 6.1 KB checked in by mattausch, 15 years ago (diff)

working on viz for submission

Line 
1#include "../shaderenv.h"
2#include "common.h"
3
4
5/*************************************************/
6/*     Filter for combining ssao with image      */
7/*************************************************/
8
9
10struct fragment
11{
12        float2 texCoord: TEXCOORD0;
13        float3 view: TEXCOORD1;
14};
15
16
17struct pixel
18{
19        float4 illum_col: COLOR0;
20};
21
22
23/** Filter taking into account depth, normal discontinuities
24   and ssao convergence of a sample (the higher the more reliably
25   has the sample a correct ssao value)
26*/
27float DiscontinuityFilter(float2 texCoord,
28                                                  float4 ao,
29                                                  float4 color,
30                                                  uniform sampler2D ssaoTex,
31                                                  uniform sampler2D normalsTex,
32                                                  uniform sampler2D colorsTex,
33                                                  uniform float2 filterOffs[NUM_SSAO_FILTER_SAMPLES],
34                                                  float scale,
35                                                  float3 bl,
36                                                  float3 br,
37                                                  float3 tl,
38                                                  float3 tr)
39{
40        float average = .0f;
41        float total_w = .0f;
42
43        //const float3 centerPos = ReconstructSamplePos(ssaoTex, texCoord, bl, br, tl, tr);
44        const float3 centerPos = ReconstructSamplePos(colorsTex, texCoord, bl, br, tl, tr);
45        const float3 centerNormal = tex2Dlod(normalsTex, float4(texCoord, 0, 0)).xyz;
46
47        float4 aoSample;
48        float3 sampleNorm;
49        float3 samplePos;
50        float w;
51        float4 sampleTexCoord;
52        float spatialFactor;
53        float normalFactor;
54        float convergenceFactor;
55        float len;
56
57        const float convergenceThresh = 200.0f;
58
59        for (int i = 0; i < NUM_SSAO_FILTER_SAMPLES; ++ i)
60        {
61                sampleTexCoord = float4(texCoord + filterOffs[i] * scale, .0f, .0f);
62
63                aoSample = tex2Dlod(ssaoTex, sampleTexCoord);
64               
65                // check spatial discontinuity
66                // note: using the depth from the color texture is not 100% correct as depth was
67                // not scaled with the interpolated view vector depth yet ...
68                samplePos = ReconstructSamplePos(colorsTex, sampleTexCoord.xy, bl, br, tl, tr);
69                //samplePos = ReconstructSamplePos(ssaoTex, sampleTexCoord.xy, bl, br, tl, tr);
70
71                len = min(SqrLen(centerPos - samplePos), 1e2f);
72                spatialFactor = 1.0f / max(len, 1e-3f);
73
74                convergenceFactor = aoSample.y + 1.0f;
75
76                //sampleNorm = tex2Dlod(normalsTex, sampleTexCoord).xyz;
77                //normalFactor = max(step(.2f, dot(sampleNorm, centerNormal)), 1e-2f);
78
79                // combine the weights
80                w = convergenceFactor * convergenceFactor * spatialFactor;// * normalFactor;
81               
82                average += aoSample.x * w;
83                total_w += w;
84        }
85
86        average /= max(total_w, 1e-6f);
87
88        return saturate(average);
89}
90
91
92/** Function combining image and indirect illumination buffer using a
93        depth and normal aware discontinuity filter. We assume that
94        we are using half resolution ssao for this version of the combineSsao
95*/
96pixel CombineSsaoHalfRes(fragment IN,
97                                                 uniform sampler2D colorsTex,
98                                                 uniform sampler2D ssaoTex,
99                                                 uniform sampler2D normalsTex,
100                                                 uniform float2 filterOffs[NUM_SSAO_FILTER_SAMPLES],
101                                                 uniform float filterWeights[NUM_SSAO_FILTER_SAMPLES],
102                                                 uniform float ssaoFilterRadius,
103                                                 uniform float4x4 modelViewProj,
104                                                 uniform float3 bl,
105                                                 uniform float3 br,
106                                                 uniform float3 tl,
107                                                 uniform float3 tr,
108                                                 uniform float w,
109                                                 uniform float h
110                                                 )
111{
112        pixel OUT;
113
114        float4 col = tex2Dlod(colorsTex, float4(IN.texCoord, 0, 0));
115        float4 ao =  tex2Dlod(ssaoTex, float4(IN.texCoord, 0, 0));
116
117#if 0 // for half resolution
118
119        // the following has to be done for half resolution ssao:
120        // get the minimum convergence by exactly sampling the 4 surrounding
121        // texels in the old texture, otherwise flickering because convergence
122        // will be interpolated when upsampling and filter size does not match!
123
124        float4 texelCenterConv;
125        const float xoffs = .5f / w; const float yoffs = .5f / h;
126
127        // get position exactly between old texel centers
128        float2 center;
129        center.x = (floor(IN.texCoord.x * w - .5f) + 1.0f) / w;
130        center.y = (floor(IN.texCoord.y * h - .5f) + 1.0f) / h;
131
132        texelCenterConv.x = tex2Dlod(ssaoTex, float4(center + float2( xoffs,  yoffs), 0, 0)).y;
133        texelCenterConv.y = tex2Dlod(ssaoTex, float4(center + float2( xoffs, -yoffs), 0, 0)).y;
134        texelCenterConv.z = tex2Dlod(ssaoTex, float4(center + float2(-xoffs, -yoffs), 0, 0)).y;
135        texelCenterConv.w = tex2Dlod(ssaoTex, float4(center + float2(-xoffs,  yoffs), 0, 0)).y;
136
137        const float m1 = min(texelCenterConv.x, texelCenterConv.y);
138        const float m2 = min(texelCenterConv.z, texelCenterConv.w);
139
140        const float minConvergence = min(m1, m2);
141        const float convergence = minConvergence;
142
143#else
144       
145        // just take unfiltered convergence in current pixel
146        const float convergence = ao.y;
147
148#endif
149       
150        // filter reaches size 1 pixel when sample size reaches threshold
151        // afterwards we do not use the filter anymore
152
153        // filter up to a certain convergance value and leave out background (sky) by checking depth
154        if ((convergence < SSAO_CONVERGENCE_THRESHOLD) && (col.w < 1e10f))
155        {
156                const float distanceScale = 1.0f;
157
158                // descend to zero filter size after reaching thres pixels
159                const float convergenceWeight = SSAO_CONVERGENCE_THRESHOLD / (ssaoFilterRadius - 1.0f);
160                const float convergenceScale = convergenceWeight / (convergence + convergenceWeight);
161                const float scale = ssaoFilterRadius * convergenceScale * distanceScale;
162
163                // the filtered ssao value
164                ao.x = DiscontinuityFilter(IN.texCoord, ao, col, ssaoTex, normalsTex, colorsTex, filterOffs, scale, bl, br, tl, tr);
165        }
166
167        // just apply ssao if we are not in the sky
168        if (col.w < 1e10f)
169                OUT.illum_col.xyz = col.xyz * max(2e-2f, 1.0f - ao.x);
170                //OUT.illum_col.xyz = col.xyz * ao.x;
171        else
172                OUT.illum_col.xyz = col.xyz;
173
174
175        //OUT.illum_col.xyz = float3(abs(ao.y * 1e2f), abs(ao.z * 1e2f), abs(ao.w * 1e2f));
176
177        //if (convergence < (1.0f + NUM_SAMPLES * 10))
178        //      OUT.illum_col.xyz = float3(1 - convergence / (NUM_SAMPLES * 10), convergence / (NUM_SAMPLES * 10), 0);
179       
180        //OUT.illum_col.xyz = float3(ao.z * 1e4f, ao.z * 1e4f, ao.z * 1e4f);
181
182        //OUT.illum_col.xyz = float3(ao.x, ao.x, step(thres, convergence));
183        //OUT.illum_col.xyz = float3(abs(center.x - IN.texCoord.x) * 16.0f, abs(center.y - IN.texCoord.y) * 12.0f, 0);
184        //OUT.illum_col.xyz = float3(0, 1.0f - step(0.5f + NUM_SAMPLES, convergence), 1);
185
186        OUT.illum_col.w = col.w;
187
188        return OUT;
189}
Note: See TracBrowser for help on using the repository browser.