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

Revision 3232, 6.1 KB checked in by mattausch, 16 years ago (diff)

started dof implementation (not working yet!)

RevLine 
[3109]1#include "../shaderenv.h"
[3163]2#include "common.h"
[3109]3
4
[3163]5/*************************************************/
6/*     Filter for combining ssao with image      */
7/*************************************************/
[3148]8
9
[3109]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
[3216]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)
[3148]26*/
[3123]27float DiscontinuityFilter(float2 texCoord,
28                                                  float4 ao,
[3137]29                                                  float4 color,
[3123]30                                                  uniform sampler2D ssaoTex,
31                                                  uniform sampler2D normalsTex,
[3137]32                                                  uniform sampler2D colorsTex,
[3167]33                                                  uniform float2 filterOffs[NUM_SSAO_FILTER_SAMPLES],
[3216]34                                                  float scale,
35                                                  float3 bl,
36                                                  float3 br,
37                                                  float3 tl,
38                                                  float3 tr)
[3109]39{
40        float average = .0f;
41        float total_w = .0f;
42
[3193]43        //const float3 centerPos = ReconstructSamplePos(ssaoTex, texCoord, bl, br, tl, tr);
44        const float3 centerPos = ReconstructSamplePos(colorsTex, texCoord, bl, br, tl, tr);
[3167]45        const float3 centerNormal = tex2Dlod(normalsTex, float4(texCoord, 0, 0)).xyz;
[3163]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;
[3167]55        float len;
[3163]56
[3192]57        const float convergenceThresh = 200.0f;
58
[3167]59        for (int i = 0; i < NUM_SSAO_FILTER_SAMPLES; ++ i)
[3163]60        {
[3198]61                sampleTexCoord = float4(texCoord + filterOffs[i] * scale, .0f, .0f);
[3163]62
63                aoSample = tex2Dlod(ssaoTex, sampleTexCoord);
[3212]64               
[3163]65                // check spatial discontinuity
[3198]66                // note: using the depth from the color texture is not 100% correct as depth was
[3193]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
[3195]71                len = min(SqrLen(centerPos - samplePos), 1e2f);
[3163]72                spatialFactor = 1.0f / max(len, 1e-3f);
73
[3195]74                convergenceFactor = aoSample.y + 1.0f;
[3212]75
76                //sampleNorm = tex2Dlod(normalsTex, sampleTexCoord).xyz;
77                //normalFactor = max(step(.2f, dot(sampleNorm, centerNormal)), 1e-2f);
78
[3163]79                // combine the weights
[3195]80                w = convergenceFactor * convergenceFactor * spatialFactor;// * normalFactor;
[3198]81               
[3163]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
[3148]92/** Function combining image and indirect illumination buffer using a
[3216]93        depth and normal aware discontinuity filter. We assume that
94        we are using half resolution ssao for this version of the combineSsao
[3148]95*/
[3216]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                                                 )
[3109]111{
112        pixel OUT;
113
114        float4 col = tex2Dlod(colorsTex, float4(IN.texCoord, 0, 0));
[3204]115        float4 ao =  tex2Dlod(ssaoTex, float4(IN.texCoord, 0, 0));
[3109]116
[3232]117#if 0 // use half size
118
[3216]119        // the following has to be done for half resolution ssao:
[3198]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!
[3216]123
[3198]124        float4 texelCenterConv;
125        const float xoffs = .5f / w; const float yoffs = .5f / h;
[3195]126
[3198]127        // get position exactly between old texel centers
[3232]128        float2 center;
[3204]129        center.x = (floor(IN.texCoord.x * w - .5f) + 1.0f) / w;
130        center.y = (floor(IN.texCoord.y * h - .5f) + 1.0f) / h;
[3205]131
[3204]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;
[3196]136
[3198]137        const float m1 = min(texelCenterConv.x, texelCenterConv.y);
138        const float m2 = min(texelCenterConv.z, texelCenterConv.w);
139
[3203]140        const float minConvergence = min(m1, m2);
[3232]141        const float convergence = minConvergence;
142
143#else
144       
145        // just take unfiltered convergence in current pixel
[3225]146        const float convergence = ao.y;
[3195]147
[3232]148#endif
149       
[3206]150        // filter reaches size 1 pixel when sample size reaches threshold
[3204]151        // afterwards we do not use the filter anymore
[3195]152
[3167]153        // filter up to a certain convergance value and leave out background (sky) by checking depth
[3206]154        if ((convergence < SSAO_CONVERGENCE_THRESHOLD) && (col.w < 1e10f))
[3164]155        {
156                const float distanceScale = 1.0f;
[3161]157
[3203]158                // descend to zero filter size after reaching thres pixels
[3216]159                const float convergenceWeight = SSAO_CONVERGENCE_THRESHOLD / (ssaoFilterRadius - 1.0f);
[3195]160                const float convergenceScale = convergenceWeight / (convergence + convergenceWeight);
[3216]161                const float scale = ssaoFilterRadius * convergenceScale * distanceScale;
[3160]162
[3167]163                // the filtered ssao value
[3216]164                ao.x = DiscontinuityFilter(IN.texCoord, ao, col, ssaoTex, normalsTex, colorsTex, filterOffs, scale, bl, br, tl, tr);
[3120]165        }
166
[3225]167        // just apply ssao if we are not in the sky
[3192]168        if (col.w < 1e10f)
[3226]169                OUT.illum_col.xyz = col.xyz * max(2e-2f, 1.0f - ao.x);
170                //OUT.illum_col.xyz = col.xyz * ao.x;
[3192]171        else
172                OUT.illum_col.xyz = col.xyz;
173
[3225]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
[3198]182        //OUT.illum_col.xyz = float3(ao.x, ao.x, step(thres, convergence));
[3204]183        //OUT.illum_col.xyz = float3(abs(center.x - IN.texCoord.x) * 16.0f, abs(center.y - IN.texCoord.y) * 12.0f, 0);
[3195]184        //OUT.illum_col.xyz = float3(0, 1.0f - step(0.5f + NUM_SAMPLES, convergence), 1);
[3225]185
[3109]186        OUT.illum_col.w = col.w;
187
188        return OUT;
[3198]189}
Note: See TracBrowser for help on using the repository browser.