From 21b1b91c448b7d148a840c06d74deabc45af1819 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Wed, 6 Oct 2010 12:53:26 -0500 Subject: ATI compatibility pass --- indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 650e1a91a8..7e41b07f8a 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -4,6 +4,8 @@ * $LicenseInfo:firstyear=2007&license=viewerlgpl$ * $/LicenseInfo$ */ + +#version 120 #extension GL_ARB_texture_rectangle : enable -- cgit v1.2.3 From e4b502793da09c746d3b0c13782ec9ffb90c54d2 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Sun, 21 Nov 2010 02:53:33 -0600 Subject: Fake anti-aliasing for deferred rendering as an alternative to real anti-aliasing. --- .../shaders/class1/deferred/postDeferredF.glsl | 93 ++++++++++++++-------- 1 file changed, 60 insertions(+), 33 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 7e41b07f8a..03c2e63fb1 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -10,50 +10,77 @@ #extension GL_ARB_texture_rectangle : enable uniform sampler2DRect diffuseRect; -uniform sampler2DRect localLightMap; -uniform sampler2DRect sunLightMap; -uniform sampler2DRect giLightMap; -uniform sampler2D luminanceMap; -uniform sampler2DRect lightMap; +uniform sampler2DRect edgeMap; +uniform sampler2DRect depthMap; +uniform sampler2DRect normalMap; +uniform sampler2D bloomMap; -uniform vec3 lum_quad; -uniform float lum_lod; -uniform vec4 ambient; - -uniform vec3 gi_quad; +uniform float depth_cutoff; +uniform float norm_cutoff; +uniform mat4 inv_proj; uniform vec2 screen_res; + varying vec2 vary_fragcoord; +float getDepth(vec2 pos_screen) +{ + float z = texture2DRect(depthMap, pos_screen.xy).a; + z = z*2.0-1.0; + vec4 ndc = vec4(0.0, 0.0, z, 1.0); + vec4 p = inv_proj*ndc; + return p.z/p.w; +} + 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; - vec3 lum = texture2DLod(luminanceMap, tc/screen_res, lum_lod).rgb; - float luminance = lum.r; - luminance = luminance*lum_quad.y+lum_quad.z; - - vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); - - float ambocc = texture2DRect(lightMap, vary_fragcoord.xy).g; - - vec3 gi_col = texture2DRect(giLightMap, vary_fragcoord.xy).rgb; - gi_col = gi_col*gi_col*gi_quad.x + gi_col*gi_quad.y+gi_quad.z*ambocc*ambient.rgb; - gi_col *= diff; - vec4 sun_col = texture2DRect(sunLightMap, 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); + 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; - vec3 local_col = texture2DRect(localLightMap, vary_fragcoord.xy).rgb; - - - sun_col *= 1.0/min(luminance, 1.0); - gi_col *= 1.0/luminance; - - vec3 col = sun_col.rgb+gi_col+local_col; + diff /= 1.0+edge_weight*8.0; - gl_FragColor.rgb = col.rgb; - col.rgb = max(col.rgb-vec3(1.0,1.0,1.0), vec3(0.0, 0.0, 0.0)); + vec4 blur = texture2DRect(edgeMap, vary_fragcoord.xy); - gl_FragColor.a = 0.0; // max(dot(col.rgb,col.rgb)*lum_quad.x, sun_col.a); + //gl_FragColor = vec4(edge_weight,edge_weight,edge_weight, 1.0); + gl_FragColor = diff + bloom; + //gl_FragColor.r = edge_weight; - //gl_FragColor.rgb = vec3(lum_lod); } -- cgit v1.2.3 From 894dd833f7351ead340047bd5d6f9950a5cecbeb Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Wed, 24 Nov 2010 03:36:41 -0600 Subject: Depth of Field whenever "Lighting and Shadows" is enabled and global-illumination is not (experimental). --- .../shaders/class1/deferred/postDeferredF.glsl | 172 ++++++++++++++++----- 1 file changed, 134 insertions(+), 38 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') 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; } -- cgit v1.2.3 From afa2999f067097cf833bce1517a3e75ccd20a32a Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Mon, 29 Nov 2010 11:54:34 -0600 Subject: Tweak DoF bloom gradient. --- .../app_settings/shaders/class1/deferred/postDeferredF.glsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index eec44d9d42..4503dc9003 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -75,11 +75,11 @@ void main() 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); + float sc = far_focal_distance - depth[0]; + sc /= near_focal_distance-far_focal_distance; - //fd = depth[0]*0.5; - + sc = min(sc, 8.0); + while (sc > 1.0) { do_aa = false; -- cgit v1.2.3 From 88ed5581d5b5df150d4adac3e1fe53fdef84c959 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Tue, 30 Nov 2010 00:26:02 -0600 Subject: Far focal plane blur attenuation tweak. --- indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 4503dc9003..a379910101 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -76,7 +76,7 @@ void main() float fd = far_focal_distance; float sc = far_focal_distance - depth[0]; - sc /= near_focal_distance-far_focal_distance; + sc /= -far_focal_distance; sc = min(sc, 8.0); -- cgit v1.2.3 From 7166b4009f738281cfacbb9b5810dfba360ec2fd Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Tue, 30 Nov 2010 04:26:44 -0600 Subject: Ditch fake anti-aliasing for deferred rendering. --- .../shaders/class1/deferred/postDeferredF.glsl | 51 +--------------------- 1 file changed, 1 insertion(+), 50 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index a379910101..77e3e41ea4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -68,7 +68,6 @@ void main() depth[0] = getDepth(tc); vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); - bool do_aa = true; if (depth[0] < far_focal_distance) { //pixel is behind far focal plane @@ -82,7 +81,6 @@ void main() 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); @@ -112,7 +110,6 @@ void main() 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); @@ -128,54 +125,8 @@ void main() } 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; -- cgit v1.2.3 From ec9ba94b69e259347f71fbbcec2f0f8fe43a47a7 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Fri, 3 Dec 2010 03:52:57 -0600 Subject: DoF tweaks -- halo hiding, etc. --- .../shaders/class1/deferred/postDeferredF.glsl | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 77e3e41ea4..02712e0a5b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -73,12 +73,14 @@ void main() { //pixel is behind far focal plane float w = 1.0; - float fd = far_focal_distance; + float fd = (depth[0]-far_focal_distance)*0.5+far_focal_distance; float sc = far_focal_distance - depth[0]; - sc /= -far_focal_distance; + sc /= near_focal_distance-far_focal_distance; + + sc = sqrt(sc); sc = min(sc, 8.0); - + while (sc > 1.0) { dofSample(diff,w, fd, sc,sc); @@ -104,8 +106,10 @@ void main() { //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); + float sc = near_focal_distance-depth[0]; + sc /= near_focal_distance; + sc *= 8.0; + sc = min(sc, 8.0); fd = depth[0]; while (sc > 1.0) -- cgit v1.2.3 From ffd7779e5b1f048c9c2220496f7382c2ad1b02eb Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Fri, 10 Dec 2010 15:13:58 -0600 Subject: DoF tweaks -- reviewed by Falcon. --- .../shaders/class1/deferred/postDeferredF.glsl | 80 ++++++++++------------ 1 file changed, 35 insertions(+), 45 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 02712e0a5b..7c89c01ea4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -17,8 +17,10 @@ uniform sampler2D bloomMap; uniform float depth_cutoff; uniform float norm_cutoff; -uniform float near_focal_distance; -uniform float far_focal_distance; +uniform float focal_distance; +uniform float blur_constant; +uniform float tan_pixel_angle; +uniform float magnification; uniform mat4 inv_proj; uniform vec2 screen_res; @@ -39,11 +41,22 @@ 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) + float wg = 1.0; + //if (d < fd) + //{ + // diff += texture2DRect(diffuseRect, tc); + // w = 1.0; + //} + if (d > fd) { - diff += texture2DRect(diffuseRect, tc); - w += 1.0; + wg = max(d/fd, 0.1); } + + diff += texture2DRect(diffuseRect, tc+vec2(0.5,0.5))*wg*0.25; + diff += texture2DRect(diffuseRect, tc+vec2(-0.5,0.5))*wg*0.25; + diff += texture2DRect(diffuseRect, tc+vec2(0.5,-0.5))*wg*0.25; + diff += texture2DRect(diffuseRect, tc+vec2(-0.5,-0.5))*wg*0.25; + w += wg; } void dofSampleNear(inout vec4 diff, inout float w, float x, float y) @@ -64,22 +77,30 @@ void main() float sc = 0.75; - float depth[5]; - depth[0] = getDepth(tc); + float depth; + depth = getDepth(tc); vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); - if (depth[0] < far_focal_distance) { //pixel is behind far focal plane float w = 1.0; - float fd = (depth[0]-far_focal_distance)*0.5+far_focal_distance; - float sc = far_focal_distance - depth[0]; - sc /= near_focal_distance-far_focal_distance; + sc = (abs(depth-focal_distance)/-depth)*blur_constant; + + sc /= magnification; + + // tan_pixel_angle = pixel_length/-depth; + float pixel_length = tan_pixel_angle*-focal_distance; + + sc = sc/pixel_length; + + //diff.r = sc; - sc = sqrt(sc); + sc = min(abs(sc), 8.0); - sc = min(sc, 8.0); + //sc = 4.0; + + float fd = depth*0.5f; while (sc > 1.0) { @@ -96,41 +117,10 @@ void main() 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 = near_focal_distance-depth[0]; - sc /= near_focal_distance; - sc *= 8.0; - sc = min(sc, 8.0); - - fd = depth[0]; - while (sc > 1.0) - { - 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; - } - } - vec4 bloom = texture2D(bloomMap, vary_fragcoord.xy/screen_res); gl_FragColor = diff + bloom; -- cgit v1.2.3 From 0b4a0f8e234087ae4d6a614c00db9eeea3bec190 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Mon, 21 Mar 2011 10:46:42 -0500 Subject: Get rid of ugly seam at near/far focal planes. --- indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 7c89c01ea4..7a6b40006b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -102,7 +102,7 @@ void main() float fd = depth*0.5f; - while (sc > 1.0) + while (sc > 0.5) { dofSample(diff,w, fd, sc,sc); dofSample(diff,w, fd, -sc,sc); -- cgit v1.2.3 From 719e3f1483b3d74174e0d9d62cdd569a03555e66 Mon Sep 17 00:00:00 2001 From: Dave Parks Date: Fri, 15 Apr 2011 17:40:26 -0500 Subject: SH-1374 Integrate bokeh depth of field effect from Tofu, but preserve edge detection. --- .../shaders/class1/deferred/postDeferredF.glsl | 118 +++++++++++---------- 1 file changed, 64 insertions(+), 54 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index 7a6b40006b..f377685045 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -36,86 +36,97 @@ float getDepth(vec2 pos_screen) return p.z/p.w; } -void dofSample(inout vec4 diff, inout float w, float fd, float x, float y) +float calc_cof(float depth) +{ + float sc = abs(depth-focal_distance)/-depth*blur_constant; + + sc /= magnification; + + // tan_pixel_angle = pixel_length/-depth; + float pixel_length = tan_pixel_angle*-focal_distance; + + sc = sc/pixel_length; + sc *= 1.414; + + return sc; +} + +void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc) { - vec2 tc = vary_fragcoord.xy+vec2(x,y); float d = getDepth(tc); + float sc = calc_cof(d); + float wg = 1.0; - //if (d < fd) - //{ - // diff += texture2DRect(diffuseRect, tc); - // w = 1.0; - //} - if (d > fd) - { - wg = max(d/fd, 0.1); - } + + vec4 s = texture2DRect(diffuseRect, tc); + // de-weight dull areas to make highlights 'pop' + wg *= s.r+s.g+s.b; + + diff += wg*s; - diff += texture2DRect(diffuseRect, tc+vec2(0.5,0.5))*wg*0.25; - diff += texture2DRect(diffuseRect, tc+vec2(-0.5,0.5))*wg*0.25; - diff += texture2DRect(diffuseRect, tc+vec2(0.5,-0.5))*wg*0.25; - diff += texture2DRect(diffuseRect, tc+vec2(-0.5,-0.5))*wg*0.25; w += wg; } -void dofSampleNear(inout vec4 diff, inout float w, float x, float y) +void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, vec2 tc) { - vec2 tc = vary_fragcoord.xy+vec2(x,y); + float d = getDepth(tc); + + float sc = calc_cof(d); + + if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius + || d < cur_depth) //sampled pixel is further away than current pixel + { + float wg = 1.0; - diff += texture2DRect(diffuseRect, tc); - w += 1.0; + vec4 s = texture2DRect(diffuseRect, tc); + // de-weight dull areas to make highlights 'pop' + wg *= s.r+s.g+s.b; + + diff += wg*s; + + w += wg; + } } + void main() { vec3 norm = texture2DRect(normalMap, vary_fragcoord.xy).xyz; norm = vec3((norm.xy-0.5)*2.0,norm.z); // unpack norm - - + vec2 tc = vary_fragcoord.xy; - float sc = 0.75; + float depth = getDepth(tc); - float depth; - depth = getDepth(tc); - vec4 diff = texture2DRect(diffuseRect, vary_fragcoord.xy); - { //pixel is behind far focal plane + { float w = 1.0; - sc = (abs(depth-focal_distance)/-depth)*blur_constant; - - sc /= magnification; - - // tan_pixel_angle = pixel_length/-depth; - float pixel_length = tan_pixel_angle*-focal_distance; - - sc = sc/pixel_length; - - //diff.r = sc; - - sc = min(abs(sc), 8.0); - - //sc = 4.0; + float sc = calc_cof(depth); + sc = min(abs(sc), 10.0); float fd = depth*0.5f; - while (sc > 0.5) + float PI = 3.14159265358979323846264; + + // sample quite uniformly spaced points within a circle, for a circular 'bokeh' + //if (depth < focal_distance) { - 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; + while (sc > 0.5) + { + int its = int(max(1.0,(sc*3.7))); + for (int i=0; i Date: Wed, 4 May 2011 15:43:21 -0500 Subject: CTS-537 Apply tweak from Tofu Buzzard. --- .../app_settings/shaders/class1/deferred/postDeferredF.glsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl') diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl index f377685045..77f1b2224c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredF.glsl @@ -57,11 +57,11 @@ void dofSampleNear(inout vec4 diff, inout float w, float cur_sc, vec2 tc) float sc = calc_cof(d); - float wg = 1.0; + float wg = 0.25; vec4 s = texture2DRect(diffuseRect, tc); // de-weight dull areas to make highlights 'pop' - wg *= s.r+s.g+s.b; + wg += s.r+s.g+s.b; diff += wg*s; @@ -77,11 +77,11 @@ void dofSample(inout vec4 diff, inout float w, float min_sc, float cur_depth, ve if (sc > min_sc //sampled pixel is more "out of focus" than current sample radius || d < cur_depth) //sampled pixel is further away than current pixel { - float wg = 1.0; + float wg = 0.25; vec4 s = texture2DRect(diffuseRect, tc); // de-weight dull areas to make highlights 'pop' - wg *= s.r+s.g+s.b; + wg += s.r+s.g+s.b; diff += wg*s; -- cgit v1.2.3