Changeset 3121


Ignore:
Timestamp:
11/12/08 10:18:15 (16 years ago)
Author:
mattausch
Message:

reordered ssao function to redcude flikering with one kernel but not working yet

Location:
GTP/trunk/App/Demos/Vis/FriendlyCulling/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/DeferredRenderer.cpp

    r3120 r3121  
    535535        sCgSsaoProgram->SetValue1f(i ++, (mUseTemporalCoherence && !mRegenerateSamples) ? tempCohFactor : 0); 
    536536         
    537         if (mUseTemporalCoherence || mRegenerateSamples) 
     537        if (//mUseTemporalCoherence ||  
     538                mRegenerateSamples) 
    538539        { 
    539540                mRegenerateSamples = false; 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/ssao.cg

    r3120 r3121  
    5757{ 
    5858        const float eyeSpaceDepth = tex2Dlod(tex, float4(texcoord, 0, 0)).w; 
    59         //float3 viewVec = normalize(Interpol(texcoord, bl, br, tl, tr)); 
     59         
    6060        float3 viewVec = Interpol(texcoord, bl, br, tl, tr); 
    6161        float3 samplePos = -viewVec * eyeSpaceDepth; 
     
    120120        reprojected color / depth values as well as a boolean that  
    121121*/ 
    122 inline float4 temporalSmoothing(float4 worldPos, 
     122inline float3 temporalSmoothing(float4 worldPos, 
    123123                                                                float eyeSpaceDepth, 
    124                                                                 float2 ao, 
    125124                                                                float2 texcoord0, 
    126125                                                                float3 oldEyePos, 
     
    145144                                                                ) 
    146145{ 
    147         float4 illum_col; 
    148  
    149146        // compute position from old frame for dynamic objects + translational portion 
    150147        const float3 translatedPos = worldPos.xyz - oldEyePos + diffVec; 
     
    162159        // retrieve the sample from the last frame 
    163160        const float4 oldPixel = tex2Dlod(oldTex, float4(oldTexCoords, .0f, .0f)); 
    164  
    165161 
    166162#if USE_EYESPACE_DEPTH 
     
    211207        } 
    212208#endif 
    213         const float oldWeight = clamp(oldPixel.y, .0f, temporalCoherence); 
     209 
     210        //const float oldWeight = clamp(oldPixel.y, .0f, temporalCoherence); 
     211        float oldWeight = oldPixel.y; 
     212 
    214213        float newWeight; 
    215214 
     
    225224                // increase the weight for convergence 
    226225                newWeight = oldWeight + 1.0f; 
    227                 illum_col.x = (ao.x + oldPixel.x * oldWeight) / newWeight; 
    228226                if (notValid > 1.0f) newWeight = 2.0f; 
    229227        } 
    230228        else 
    231229        {        
    232                 illum_col.x = ao.x; 
    233                 newWeight = .0f; 
    234         } 
    235  
    236         illum_col.y = newWeight; 
    237  
    238 #if USE_EYESPACE_DEPTH 
    239         illum_col.w = eyeSpaceDepth; 
    240 #else 
    241         illum_col.w = projectedDepth; 
    242 #endif 
    243         //overallDepth = clamp(overallDepth*1e3, 0, 1); 
    244         illum_col.z = invW; 
    245         //illum_col.x = overallDepth; 
    246  
    247         return illum_col; 
     230                newWeight = 1.0f; 
     231        } 
     232 
     233        if (oldPixel.y >= temporalCoherence) 
     234                newWeight = min(temporalCoherence+1, max(oldPixel.y - 70, 50)); 
     235 
     236        return float3(oldPixel.x, newWeight, eyeSpaceDepth); 
    248237} 
    249238 
     
    263252                        float3 tr,  
    264253                        float3 viewDir 
    265                         //,float2 noiseOffs 
     254                        , float2 noiseOffs 
    266255                        ) 
    267256{ 
     
    282271                //-- add random noise: reflect around random normal vector (rather slow!) 
    283272 
    284                 //float2 mynoise = tex2Dlod(noiseTex, float4(IN.texCoord * 4.0f + noiseOffs, 0, 0)).xy; 
    285                 float2 mynoise = tex2Dlod(noiseTex, float4(IN.texCoord * 4.0f, 0, 0)).xy; 
     273                float2 mynoise = tex2Dlod(noiseTex, float4(IN.texCoord * 4.0f + noiseOffs, 0, 0)).xy; 
     274                //float2 mynoise = tex2Dlod(noiseTex, float4(IN.texCoord * 4.0f, 0, 0)).xy; 
    286275                const float2 offsetTransformed = myreflect(offset, mynoise); 
    287276#else 
     
    325314        return float2(max(0.0f, 1.0f - total_ao), numSamples); 
    326315} 
     316 
    327317 
    328318/** The mrt shader for screen space ambient occlusion 
     
    354344 
    355345        // reconstruct position from the eye space depth 
    356         //const float3 viewDir = normalize(IN.view); 
    357346        const float3 viewDir = IN.view; 
    358347        const float eyeSpaceDepth = tex2Dlod(colors, float4(IN.texCoord, 0, 0)).w; 
    359348        const float4 eyeSpacePos = float4(-viewDir * eyeSpaceDepth, 1.0f); 
    360349 
     350        //float3 id = tex2Dlod(attribsTex, float4(IN.texCoord, 0, 0)).xyz; 
     351        float3 diffVec = tex2Dlod(attribsTex, float4(IN.texCoord, 0, 0)).xyz; 
     352         
    361353 
    362354        //////////////// 
     
    367359        projPos *= invw; 
    368360        float scaleFactor = SAMPLE_RADIUS * invw; 
    369          
    370         float2 ao = float2(1.0f, 0); 
     361 
     362         
     363        ///////////////// 
     364        //-- compute temporal reprojection 
     365 
     366        float3 temporalVals = temporalSmoothing(eyeSpacePos, eyeSpaceDepth, IN.texCoord, oldEyePos, 
     367                                                oldTex, oldModelViewProj, temporalCoherence, 
     368                                                                                        colors,  
     369                                                                                        bl, br, tl, tr,  
     370                                                                                        projPos.xyz,  
     371                                                                                        invw,  
     372                                                                                        noiseTex,  
     373                                                                                        samples,  
     374                                                                                        scaleFactor,  
     375                                                                                        oldbl, oldbr, oldtl, oldtr, 
     376                                                                                        diffVec); 
     377 
     378        const float oldSsao = temporalVals.x; 
     379        const float newWeight = temporalVals.y; 
     380 
     381        float2 noiseOffs = float2(newWeight / 256.0f, (newWeight - 256.0f) / 192.0f); 
     382 
     383        float2 ao; 
    371384        // note: this should be done with the stencil buffer 
    372385        if (eyeSpaceDepth < 1e10f) 
    373386        { 
    374387                ao = ssao(IN, colors, noiseTex, samples, normal,  
    375                           eyeSpacePos.xyz, scaleFactor, bl, br, tl, tr, normalize(viewDir));//, noiseOffs); 
    376         } 
    377  
    378         //float3 id = tex2Dlod(attribsTex, float4(IN.texCoord, 0, 0)).xyz; 
    379         float3 diffVec = tex2Dlod(attribsTex, float4(IN.texCoord, 0, 0)).xyz; 
    380  
    381  
    382         ///////////////// 
    383         //-- compute temporal reprojection 
    384  
    385         OUT.illum_col = temporalSmoothing(eyeSpacePos, eyeSpaceDepth, ao, IN.texCoord, oldEyePos, 
    386                                               oldTex, oldModelViewProj, temporalCoherence, 
    387                                               colors,  
    388                                                                           bl, br, tl, tr,  
    389                                                                           projPos.xyz,  
    390                                                                           invw,  
    391                                                                           noiseTex,  
    392                                                                           samples,  
    393                                                                           scaleFactor,  
    394                                                                           oldbl, oldbr, oldtl, oldtr, 
    395                                                                           diffVec); 
     388                          eyeSpacePos.xyz, scaleFactor, bl, br, tl, tr, normalize(viewDir), noiseOffs); 
     389        } 
     390        else 
     391        { 
     392                 ao = float2(1.0f, 0); 
     393        } 
     394 
     395 
     396        OUT.illum_col.x = (ao.x + oldSsao * (newWeight - 1.0f)) / newWeight; 
     397        OUT.illum_col.y = newWeight; 
     398        OUT.illum_col.z = invw; 
     399        OUT.illum_col.w = temporalVals.z; 
    396400 
    397401        return OUT; 
Note: See TracChangeset for help on using the changeset viewer.