Changeset 2904


Ignore:
Timestamp:
09/04/08 16:46:27 (16 years ago)
Author:
mattausch
Message:

got rid of error with newly visible surfaces, much faster

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

Legend:

Unmodified
Added
Removed
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaderenv.h

    r2903 r2904  
    88// for linear falloff 
    99//#define SAMPLE_INTENSITY 500.0f 
    10 //#define SAMPLE_INTENSITY 100.0f 
     10//#define SAMPLE_INTENSITY 40.0f 
    1111 
    1212// for quadradtc falloff 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/globillum.cg

    r2903 r2904  
    3737} 
    3838 
     39struct GiStruct 
     40{ 
     41        float3 illum; 
     42        float2 ao; 
     43}; 
     44 
     45 
    3946/** Computes  diffuse reflections + ambient occlusion 
    4047*/ 
    41 float4 globIllum(fragment IN, 
     48GiStruct globIllum(fragment IN, 
    4249                                 uniform sampler2D colors, 
    4350                                 uniform sampler2D positions, 
     
    4956                                 ) 
    5057{ 
     58        GiStruct gi; 
     59 
    5160        // the w coordinate from the persp. projection 
    5261        float w = centerPosition.w; 
     
    5766 
    5867        // ao is in stored in the w component 
    59         float4 total_color = float4(0, 0, 0, 1); 
    60  
     68        float3 total_color = float3(0, 0, 0); 
     69        float total_ao = 0.0f; 
     70        float numSamples = 0.0f; 
    6171 
    6272        //////////// 
     
    7888                float2 texcoord = IN.texCoord.xy + offsetTransformed * AREA_SIZE * w; 
    7989 
     90                if ((texcoord.x <= 1.0f) && (texcoord.x >= 0.0f) && (texcoord.y <= 1.0f) && (texcoord.y >= 0.0f)) 
     91                        ++ numSamples; 
     92 
    8093                // use lower lod level to improve cache coherence 
    8194                float3 sample_position = tex2Dlod(positions, float4(texcoord, 0, 1)).xyz; 
     
    100113                total_color.xyz += cos_angle * distance_intensity * view_correction * sample_color * ILLUM_INTENSITY; 
    101114                */ 
    102                 total_color.w -= cos_angle * distance_intensity; 
    103                 total_color.xyz += cos_angle * distance_intensity * sample_color * ILLUM_INTENSITY; 
     115                total_ao += cos_angle * distance_intensity; 
     116                total_color += cos_angle * distance_intensity * sample_color * ILLUM_INTENSITY; 
    104117        } 
    105118 
    106         return saturate(total_color); 
     119        gi.illum = saturate(total_color); 
     120        gi.ao = float2(max(0.0f, 1.0f - total_ao), numSamples); 
     121 
     122        //return saturate(total_color); 
     123        return gi; 
    107124} 
    108125 
     
    144161        const float currentDepth = currentCol.w; 
    145162 
    146         float4 new_color = globIllum(IN, colors, positions, noiseTexture,  
    147                                  samples, normal, viewDir, centerPosition); 
     163        GiStruct gi = globIllum(IN, colors, positions, noiseTexture, samples, normal, viewDir, centerPosition); 
    148164         
    149165 
     
    168184        float oldWeight = clamp(oldSsao.z, 0, temporalCoherence); 
    169185        float newWeight; 
     186 
     187        const float oldNumSamples = oldSsao.y; 
    170188 
    171189        if ((temporalCoherence > 0.0f) && 
    172190                (tex.x >= 0.0f) && (tex.x < 1.0f) &&  
    173191                (tex.y >= 0.0f) && (tex.y < 1.0f) &&  
    174                 (abs(depthDif)  < 1e-3f)) 
     192                (abs(depthDif)  < 1e-3f) 
     193                && (oldNumSamples > gi.ao.y - 1.5f) // check if something happened in the surrounding area 
     194                ) 
    175195        { 
    176196                newWeight = oldWeight + 1; 
    177197 
    178                 //OUT.illum_col = (float4)ao * expFactor + oldCol.x * (1.0f - expFactor); 
    179                 OUT.ssao_col.x = (new_color.w + oldSsao.x * oldWeight) / newWeight; 
    180                 OUT.illum_col  = (new_color + oldIllum * oldWeight) / newWeight; 
    181  
    182                 //OUT.ssao_col.x = new_color.w * expFactor + oldSsao.x * (1.0f - expFactor); 
    183                 //OUT.illum_col = new_color * expFactor + oldIllum * (1.0f - expFactor); 
     198                OUT.ssao_col.xy = (gi.ao + oldSsao.xy * oldWeight) / newWeight; 
     199                OUT.illum_col.xyz  = (gi.illum + oldIllum.xyz * oldWeight) / newWeight; 
    184200        } 
    185201        else 
     
    187203                newWeight = 0; 
    188204 
    189                 OUT.ssao_col.x = new_color.w; 
    190                 OUT.illum_col = new_color; 
     205                OUT.ssao_col.xy = gi.ao.xy; 
     206                OUT.illum_col.xyz = gi.illum; 
    191207        } 
    192208 
     
    211227         
    212228        OUT.illum_col = (col + illum) * ao; 
     229        //OUT.illum_col = ao; 
     230 
    213231        OUT.illum_col.w = col.w; 
    214232 
  • GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/ssao.cg

    r2903 r2904  
    3535/** The ssao shader returning the an intensity value between 0 and 1 
    3636*/ 
    37 float ssao(fragment IN, 
     37float2 ssao(fragment IN, 
    3838                   uniform sampler2D positions, 
    3939                   uniform sampler2D noiseTexture, 
    4040                   uniform float2 samples[NUM_SAMPLES], 
    4141                   uniform float3 currentNormal, 
    42                    uniform float3 currentViewDir, 
    4342                   uniform float4 centerPosition 
     43                   //,uniform float3 currentViewDir 
    4444                   ) 
    4545{ 
     
    5252 
    5353        float total_ao = 0.0; 
     54        float numSamples = 0; 
    5455 
    5556        for (int i = 0; i < NUM_SAMPLES; ++ i)  
     
    6869                float2 texcoord = IN.texCoord.xy + offsetTransformed * AREA_SIZE * w; 
    6970 
    70                 //if ((texcoord.x <= 1.0f) || (texcoord.x >= 0.0f) || (texcoord.y <= 1.0f) || (texcoord.y >= 0.0f)) 
    71                  
     71                if ((texcoord.x <= 1.0f) && (texcoord.x >= 0.0f) && (texcoord.y <= 1.0f) && (texcoord.y >= 0.0f)) 
     72                        ++ numSamples; 
     73 
    7274                // sample downsampled texture in order to speed up texture accesses 
    7375                float3 sample_position = tex2Dlod(positions, float4(texcoord, 0, 1)).xyz; 
     
    9294 
    9395                total_ao += cos_angle * distance_intensity; 
     96 
     97                //total_ao /= j; 
    9498        } 
    9599 
    96         return max(0.0f, 1.0f - total_ao); 
     100        return float2(max(0.0f, 1.0f - total_ao), numSamples); 
    97101        //return saturate(dot(currentViewDir, currentNormal)); 
    98102} 
     
    124128         
    125129        /// the current view direction 
    126         float3 viewDir;// = normalize(IN.view); 
     130        //float3 viewDir = normalize(IN.view); 
    127131 
    128132        // the current world position 
     
    133137        const float currentDepth = currentCol.w; 
    134138 
    135         const float ao = ssao(IN, positions, noiseTexture, samples, normal, viewDir, centerPosition); 
     139        const float2 ao = ssao(IN, positions, noiseTexture, samples, normal, centerPosition);//, viewDir); 
    136140                 
    137141 
     
    154158 
    155159        float oldWeight = clamp(oldCol.z, 0, temporalCoherence); 
     160        float oldNumSamples = oldCol.y; 
     161 
    156162        float newWeight; 
    157163 
    158         if ((temporalCoherence > 0) && 
     164        if (//(temporalCoherence > 0) && 
    159165                (tex.x >= 0.0f) && (tex.x < 1.0f) &&  
    160166                (tex.y >= 0.0f) && (tex.y < 1.0f) &&  
    161                 (abs(depthDif) < 1e-4f)) 
     167                (abs(depthDif) < 1e-3f)  
     168                && (oldNumSamples > ao.y - 1.5f) // check if something happened in the surrounding area 
     169                ) 
    162170        { 
    163                 newWeight = oldWeight + 1; 
     171                // increase the weight for convergence 
     172                newWeight = oldWeight + 1.0f; 
    164173 
    165174                //OUT.illum_col = (float4)ao * expFactor + oldCol.x * (1.0f - expFactor); 
    166                 OUT.illum_col = (float4)(ao + oldCol.x * oldWeight) / newWeight; 
     175                OUT.illum_col.xy = (ao.xy + oldCol.xy * oldWeight) / newWeight; 
     176 
     177                //if (!(oldNumSamples > ao.y - 1.5f)) newWeight = 0; 
    167178        } 
    168179        else 
    169180        { 
    170                 OUT.illum_col = (float4)ao; 
     181                OUT.illum_col.xy = ao.xy; 
    171182                newWeight = 0; 
    172183        } 
    173184 
    174185 
     186        //OUT.illum_col.y = ao.y; 
    175187        OUT.illum_col.z = newWeight; 
    176188        OUT.illum_col.w = currentDepth; 
Note: See TracChangeset for help on using the changeset viewer.