diff options
author | Dave Parks <davep@lindenlab.com> | 2010-11-24 03:36:41 -0600 |
---|---|---|
committer | Dave Parks <davep@lindenlab.com> | 2010-11-24 03:36:41 -0600 |
commit | 894dd833f7351ead340047bd5d6f9950a5cecbeb (patch) | |
tree | 10e6539c2d3cdafc2b74238063d0293d774e92c5 /indra/newview/app_settings/shaders/class1/deferred | |
parent | 2915715ec4a9bb7978c4a0db0afc26b73ab8b2fb (diff) |
Depth of Field whenever "Lighting and Shadows" is enabled and global-illumination is not (experimental).
Diffstat (limited to 'indra/newview/app_settings/shaders/class1/deferred')
-rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl | 172 |
1 files changed, 134 insertions, 38 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 03c2e63fb1..eec44d9d42 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -17,6 +17,8 @@ uniform sampler2D bloomMap; uniform float depth_cutoff; uniform float norm_cutoff; +uniform float near_focal_distance; +uniform float far_focal_distance; uniform mat4 inv_proj; uniform vec2 screen_res; @@ -32,55 +34,149 @@ float getDepth(vec2 pos_screen) return p.z/p.w; } +void dofSample(inout vec4 diff, inout float w, float fd, float x, float y) +{ + vec2 tc = vary_fragcoord.xy+vec2(x,y); + float d = getDepth(tc); + + if (d < fd) + { + diff += texture2DRect(diffuseRect, tc); + w += 1.0; + } +} + +void dofSampleNear(inout vec4 diff, inout float w, float x, float y) +{ + vec2 tc = vary_fragcoord.xy+vec2(x,y); + + diff += texture2DRect(diffuseRect, tc); + w += 1.0; +} + void main() { vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz; norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm - float depth = getDepth(vary_fragcoord.xy); + vec2 tc = vary_fragcoord.xy; float sc = 0.75; - vec2 de; - de.x = (depth-getDepth(tc+vec2(sc, sc))) + (depth-getDepth(tc+vec2(-sc, -sc))); - de.y = (depth-getDepth(tc+vec2(-sc, sc))) + (depth-getDepth(tc+vec2(sc, -sc))); - de /= depth; - de *= de; - de = step(depth_cutoff, de); - - vec2 ne; - vec3 nexnorm = texture2DRect(normalMap, tc+vec2(-sc,-sc)).rgb; - nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm - ne.x = dot(nexnorm, norm); - vec3 neynorm = texture2DRect(normalMap, tc+vec2(sc,sc)).rgb; - neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm - ne.y = dot(neynorm, norm); - - ne = 1.0-ne; - - ne = step(norm_cutoff, ne); - - float edge_weight = clamp(dot(de,de)+dot(ne,ne), 0.0, 1.0); - //edge_weight *= 0.0; - - vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); + float depth[5]; + depth[0] = getDepth(tc); + vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,-1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,-1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,0))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,0))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,1))*edge_weight; - diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,-1))*edge_weight; - - diff /= 1.0+edge_weight*8.0; + bool do_aa = true; - vec4 blur = texture2DRect(edgeMap, vary_fragcoord.xy); - - //gl_FragColor = vec4(edge_weight,edge_weight,edge_weight, 1.0); + if (depth[0] < far_focal_distance) + { //pixel is behind far focal plane + float w = 1.0; + + float fd = far_focal_distance; + float sc = clamp(depth[0]/fd, 0.0, -8.0/fd); + sc = min(sc, 8.0); + + //fd = depth[0]*0.5; + + while (sc > 1.0) + { + do_aa = false; + dofSample(diff,w, fd, sc,sc); + dofSample(diff,w, fd, -sc,sc); + dofSample(diff,w, fd, sc,-sc); + dofSample(diff,w, fd, -sc,-sc); + + sc -= 0.5; + float sc2 = sc*1.414; + dofSample(diff,w, fd, 0,sc2); + dofSample(diff,w, fd, 0,-sc2); + dofSample(diff,w, fd, -sc2,0); + dofSample(diff,w, fd, sc2,0); + sc -= 0.5; + } + diff /= w; + } + else + { + float fd = near_focal_distance; + + if (depth[0] > fd) + { //pixel is in front of near focal plane + //diff.r = 1.0; + float w = 1.0; + float sc = depth[0] - fd; + sc = min(-sc/fd*16.0, 8.0); + + fd = depth[0]; + while (sc > 1.0) + { + do_aa = false; + dofSampleNear(diff,w, sc,sc); + dofSampleNear(diff,w, -sc,sc); + dofSampleNear(diff,w, sc,-sc); + dofSampleNear(diff,w, -sc,-sc); + + sc -= 0.5; + float sc2 = sc*1.414; + dofSampleNear(diff,w, 0,sc2); + dofSampleNear(diff,w, 0,-sc2); + dofSampleNear(diff,w, -sc2,0); + dofSampleNear(diff,w, sc2,0); + sc -= 0.5; + } + diff /= w; + } + + if (do_aa) + { + depth[1] = getDepth(tc+vec2(sc,sc)); + depth[2] = getDepth(tc+vec2(-sc,-sc)); + depth[3] = getDepth(tc+vec2(-sc,sc)); + depth[4] = getDepth(tc+vec2(sc, -sc)); + + + vec2 de; + de.x = (depth[0]-depth[1]) + (depth[0]-depth[2]); + de.y = (depth[0]-depth[3]) + (depth[0]-depth[4]); + de /= depth[0]; + de *= de; + de = step(depth_cutoff, de); + + vec2 ne; + vec3 nexnorm = texture2DRect(normalMap, tc+vec2(-sc,-sc)).rgb; + nexnorm = vec3((nexnorm.xy-0.5)*2.0,nexnorm.z); // unpack norm + ne.x = dot(nexnorm, norm); + vec3 neynorm = texture2DRect(normalMap, tc+vec2(sc,sc)).rgb; + neynorm = vec3((neynorm.xy-0.5)*2.0,neynorm.z); // unpack norm + ne.y = dot(neynorm, norm); + + ne = 1.0-ne; + + ne = step(norm_cutoff, ne); + + float edge_weight = clamp(dot(de,de)+dot(ne,ne), 0.0, 1.0); + //edge_weight *= 0.0; + + //diff.r = edge_weight; + + if (edge_weight > 0.0) + { + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,1))*edge_weight; + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,-1))*edge_weight; + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,1))*edge_weight; + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,-1))*edge_weight; + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(-1,0))*edge_weight; + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(1,0))*edge_weight; + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,1))*edge_weight; + diff += texture2DRect(diffuseRect, vary_fragcoord.xy+vec2(0,-1))*edge_weight; + diff /= 1.0+edge_weight*8.0; + } + } + } + + vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); gl_FragColor = diff + bloom; - //gl_FragColor.r = edge_weight; } |