- Timestamp:
- 10/03/08 14:35:07 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/ssao.cg
r2997 r2999 48 48 float3 bl, float3 br, float3 tl, float3 tr) 49 49 { 50 #if 050 #if 1 51 51 float eyeSpaceDepth = tex2Dlod(colors, float4(texcoord, 0, SSAO_MIPMAP_LEVEL)).w; 52 float3 rotView = normalize(Interpol(texcoord, bl, br, tl, tr)); 53 54 float3 sample_position = eyePos - rotView * eyeSpaceDepth; 52 //float3 rotView = normalize(Interpol(texcoord, bl, br, tl, tr)); 53 float3 rotView = Interpol(texcoord, bl, br, tl, tr); 54 55 float3 samplePos = eyePos - rotView * eyeSpaceDepth; 55 56 #else 56 float3 sample _position= tex2Dlod(colors, float4(texcoord, 0, SSAO_MIPMAP_LEVEL)).xyz;57 #endif 58 return sample _position;57 float3 samplePos = tex2Dlod(colors, float4(texcoord, 0, SSAO_MIPMAP_LEVEL)).xyz; 58 #endif 59 return samplePos; 59 60 } 60 61 … … 101 102 float2 texcoord = IN.texCoord.xy + offsetTransformed * AREA_SIZE * scaleFactor; 102 103 103 if ((texcoord.x <= 1.0f) && (texcoord.x >= 0.0f) && (texcoord.y <= 1.0f) && (texcoord.y >= 0.0f)) 104 ++ numSamples; 105 106 float3 sample_position = ReconstructSamplePosition(eyePos, colors, texcoord, bl, br, tl, tr); 107 108 float3 vector_to_sample = sample_position - centerPosition.xyz; 109 const float length_to_sample = length(vector_to_sample); 110 111 float3 direction_to_sample = vector_to_sample / length_to_sample; 104 //if ((texcoord.x <= 1.0f) && (texcoord.x >= 0.0f) && (texcoord.y <= 1.0f) && (texcoord.y >= 0.0f))++ numSamples; 105 106 // get sample world space position 107 float eyeSpaceDepth = tex2Dlod(colors, float4(texcoord, 0, SSAO_MIPMAP_LEVEL)).w; 108 //float3 rotView = normalize(Interpol(texcoord, bl, br, tl, tr)); 109 float3 rotView = Interpol(texcoord, bl, br, tl, tr); 110 111 float3 samplePos = ReconstructSamplePosition(eyePos, colors, texcoord, bl, br, tl, tr); 112 113 114 /////// 115 //-- compute contribution of current sample taking into account direction and angle 116 117 float3 dirSample = samplePos - centerPosition.xyz; 118 const float lengthSample = length(dirSample); 119 120 float3 nDirSample = dirSample / lengthSample; 112 121 113 122 // angle between current normal and direction to sample controls AO intensity. 114 const float cos_angle = max(dot( direction_to_sample, currentNormal), 0.0f);123 const float cos_angle = max(dot(nDirSample, currentNormal), 0.0f); 115 124 116 125 // the distance_scale offset is used to avoid singularity that occurs at global illumination when 117 126 // the distance to a sample approaches zero 118 const float distance_intensity =119 (SAMPLE_INTENSITY * DISTANCE_SCALE) / (DISTANCE_SCALE + length _to_sample * length_to_sample);127 const float intensity = 128 (SAMPLE_INTENSITY * DISTANCE_SCALE) / (DISTANCE_SCALE + lengthSample * lengthSample); 120 129 121 130 #if 0 122 131 // if surface normal perpenticular to view dir, approx. half of the samples will not count 123 132 // => compensate for this (on the other hand, projected sampling area could be larger!) 124 const float view _correction = 1.0f + VIEW_CORRECTION_SCALE * (1.0f - dot(currentViewDir, currentNormal));125 total_ao += cos_angle * distance_intensity * view_correction;126 #endif 127 total_ao += cos_angle * distance_intensity;133 const float viewCorrection = 1.0f + VIEW_CORRECTION_SCALE * (1.0f - dot(currentViewDir, currentNormal)); 134 total_ao += cos_angle * intensity * viewCorrection; 135 #endif 136 total_ao += cos_angle * intensity; 128 137 } 129 138 130 139 return float2(max(0.0f, 1.0f - total_ao), numSamples); 131 //return saturate(dot(currentViewDir, currentNormal));132 140 } 133 141 … … 165 173 const float4 centerPosition = tex2D(positions, IN.texCoord.xy); 166 174 167 #if 1175 #if 0 168 176 const float2 ao = ssao(IN, positions, noiseTexture, samples, normal, centerPosition, w, eyePos, bl, br, tl, tr); 169 177 … … 197 205 float4 oldPos = mul(oldModelViewProj, realPos); 198 206 207 const float4 projPos = oldPos / oldPos.w; 208 199 209 // the current depth projected into the old frame 200 const float projDepth = oldPos.z / oldPos.w;210 const float projDepth = projPos.z; 201 211 202 212 // fit from unit cube into 0 .. 1 203 float2 tex = ( oldPos.xy / oldPos.w) * 0.5f + 0.5f;213 float2 tex = (projPos.xy) * 0.5f + 0.5f; 204 214 205 215 // optain the sample from the last frame … … 212 222 const float depthDif = 1.0f - projDepth / oldDepth; 213 223 214 215 224 float newWeight; 216 225 217 226 // the number of valid samples in this frame 218 const float newNumSamples = ao.y;227 //const float newNumSamples = ao.y; 219 228 220 229 … … 224 233 (abs(depthDif) < 1e-4f) 225 234 // if visibility changed in the surrounding area we have to recompute 226 && (oldNumSamples > 0.8f * newNumSamples)235 //&& (oldNumSamples > 0.8f * newNumSamples) 227 236 ) 228 237 {
Note: See TracChangeset
for help on using the changeset viewer.