Changeset 2999 for GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders
- Timestamp:
- 10/03/08 14:35:07 (16 years ago)
- Location:
- GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/globillum.cg
r2991 r2999 65 65 uniform float4 centerPosition, 66 66 float w, 67 // uniform float3 viewDir,68 67 uniform float3 eyePos, 69 68 uniform float3 bl, … … 71 70 uniform float3 tl, 72 71 uniform float3 tr 72 //, uniform float3 viewDir 73 73 ) 74 74 { … … 102 102 float2 texcoord = IN.texCoord.xy + offsetTransformed * AREA_SIZE * w; 103 103 104 if ((texcoord.x <= 1.0f) && (texcoord.x >= 0.0f) && (texcoord.y <= 1.0f) && (texcoord.y >= 0.0f)) 105 ++ numSamples; 104 //if ((texcoord.x <= 1.0f) && (texcoord.x >= 0.0f) && (texcoord.y <= 1.0f) && (texcoord.y >= 0.0f)) ++ numSamples; 106 105 107 106 // reconstruct world space position from sample 108 107 float4 sample = tex2Dlod(colors, float4(texcoord, 0, SSAO_MIPMAP_LEVEL)); 109 108 const float eyeSpaceDepth = sample.w; 110 float3 rotView = normalize(Interpol(texcoord, bl, br, tl, tr)); 109 //float3 rotView = normalize(Interpol(texcoord, bl, br, tl, tr)); 110 float3 rotView = Interpol(texcoord, bl, br, tl, tr); 111 111 112 112 const float3 sample_position = eyePos - rotView * eyeSpaceDepth; … … 213 213 const float oldAvgDepth = oldSsao.z; 214 214 215 if ( (temporalCoherence > 0.0f) &&215 if (//(temporalCoherence > 0.0f) && 216 216 (tex.x >= 0.0f) && (tex.x < 1.0f) && 217 217 (tex.y >= 0.0f) && (tex.y < 1.0f) && 218 218 (abs(depthDif) < 1e-3f) 219 219 // check if something changed in the surrounding area 220 && (oldNumSamples > 0.2 * gi.ao.y) 221 //&& (oldAvgDepth / newAvgDepth > 0.99) 220 //&& (oldNumSamples > 0.2 * gi.ao.y) 222 221 ) 223 222 { -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/mrt.cg
r2989 r2999 38 38 { 39 39 float4 col: COLOR0; 40 float4 pos: COLOR1; 40 //float4 pos: COLOR1; 41 float2 pos: COLOR1; 41 42 float4 norm: COLOR2; 42 43 }; … … 65 66 66 67 68 // bilinear interpolation 69 inline float3 Interpol(float2 w, float3 bl, float3 br, float3 tl, float3 tr) 70 { 71 float3 x1 = lerp(bl, tl, w.y); 72 float3 x2 = lerp(br, tr, w.y); 73 float3 v = lerp(x1, x2, w.x); 74 75 return v; 76 } 77 78 67 79 pixel fragtex(fragin IN, 68 80 uniform sampler2D dirtTex, 69 81 uniform float maxDepth, 70 82 uniform sampler2D tex, 71 uniform float3 currentPos) 83 uniform float3 eyePos, 84 uniform float3 bl, 85 uniform float3 br, 86 uniform float3 tl, 87 uniform float3 tr) 72 88 { 89 float4 texColor = tex2D(tex, IN.texCoord.xy); 90 91 // account for alpha blending 92 if (texColor.w < 0.5f) discard; 93 73 94 pixel pix; 74 75 float4 texColor = tex2D(tex, IN.texCoord.xy);76 95 77 96 // save color in first render target 78 97 // hack: use combination of emmisive + diffuse (emmisive used as constant ambient term) 79 98 pix.col = (glstate.material.emission + glstate.material.diffuse) * texColor; 80 99 81 100 // save world position in second render target 82 pix.pos = IN.worldPos * maxDepth;101 //pix.pos = IN.worldPos * maxDepth; 83 102 // save world space normal in third rt 84 103 pix.norm.xyz = IN.normal; … … 86 105 // store projection coordinates with positions (used for ssao) 87 106 pix.norm.w = IN.projPos.w; 88 // write the depth89 pix.pos.w = IN.mypos.z / IN.mypos.w;90 107 91 // account for alpha blending 92 if (pix.col.w < 0.5f) 93 discard; 108 const float4 projPos = IN.mypos / IN.mypos.w; 109 // store the projected depth 110 pix.pos.y = projPos.z; 111 112 float2 screenCoord = projPos.xy * 0.5f + 0.5f; 113 const float magView = length(Interpol(screenCoord, bl, br, tl, tr)); 94 114 95 115 // hack: squeeze some information about ambient into the texture 96 116 //pix.col.w = glstate.material.emission.x; 97 pix.col.w = length(currentPos - IN.worldPos) * maxDepth; 117 118 // eye linear depth 119 pix.col.w = (length(eyePos - IN.worldPos.xyz) * maxDepth) / magView; 120 pix.pos.x = pix.col.x; 98 121 99 122 return pix; … … 101 124 102 125 103 pixel frag(fragin IN, uniform float maxDepth, uniform float3 currentPos) 126 pixel frag(fragin IN, 127 uniform float maxDepth, 128 uniform float3 eyePos, 129 uniform float3 bl, 130 uniform float3 br, 131 uniform float3 tl, 132 uniform float3 tr) 104 133 { 105 134 pixel pix; … … 107 136 // hack: use comination of emmisive + diffuse (emmisive used as constant ambient term) 108 137 pix.col = glstate.material.diffuse + glstate.material.emission; 109 pix.pos = IN.worldPos * maxDepth;138 //pix.pos = IN.worldPos * maxDepth; 110 139 111 140 pix.norm.xyz = IN.normal; … … 113 142 // store projection coordinates with positions (used for ssao) 114 143 pix.norm.w = IN.mypos.w; 115 // the projected depth 116 pix.pos.w = IN.mypos.z / IN.mypos.w; 117 144 145 const float4 projPos = IN.mypos / IN.mypos.w; 146 // store the projected depth 147 pix.pos.y = projPos.z; 148 149 float2 screenCoord = projPos.xy * 0.5f + 0.5f; 150 const float magView = length(Interpol(screenCoord, bl, br, tl, tr)); 151 118 152 // hack: squeeze some information about the ambient term into the target 119 153 //pix.col.w = glstate.material.emission.x; 120 pix.col.w = length(currentPos - IN.worldPos) * maxDepth; 154 pix.col.w = (length(eyePos - IN.worldPos.xyz) * maxDepth) / magView; 155 pix.pos.x = pix.col.x; 121 156 122 157 return pix; -
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 { -
GTP/trunk/App/Demos/Vis/FriendlyCulling/src/shaders/tonemap.cg
r2992 r2999 130 130 float logLumScaled = logLum * INV_LOGLUM_RANGE - logLumOffset; 131 131 132 if (oldLogLum > 0)132 if (oldLogLum > 1e-5f) // too hight log lum 133 133 OUT.col.w = lerp(oldLogLum, logLumScaled, 0.1f); 134 134 else
Note: See TracChangeset
for help on using the changeset viewer.