summaryrefslogtreecommitdiff
path: root/indra/newview/app_settings/shaders/class1/deferred
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2010-11-24 03:36:41 -0600
committerDave Parks <davep@lindenlab.com>2010-11-24 03:36:41 -0600
commit894dd833f7351ead340047bd5d6f9950a5cecbeb (patch)
tree10e6539c2d3cdafc2b74238063d0293d774e92c5 /indra/newview/app_settings/shaders/class1/deferred
parent2915715ec4a9bb7978c4a0db0afc26b73ab8b2fb (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.glsl172
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;
}