Commit: 33722d4011256fc79afa7928dd735ffed5fc492f
Author: Antony Riakiotakis
Date:   Fri Sep 12 19:56:56 2014 +0200
Branches: viewport_experiments
https://developer.blender.org/rB33722d4011256fc79afa7928dd735ffed5fc492f

Greatly improved normal calculation using view space position
derivatives.

===================================================================

M       release/scripts/startup/bl_ui/space_view3d.py
M       source/blender/gpu/shaders/gpu_shader_fx_frag.glsl

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_view3d.py 
b/release/scripts/startup/bl_ui/space_view3d.py
index b192d24..dce5749 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -2869,8 +2869,7 @@ class VIEW3D_PT_view3d_shading(Panel):
         if view.viewport_shade not in {'BOUNDBOX', 'WIREFRAME'}:
             if obj and obj.mode == 'EDIT':
                 col.prop(view, "show_occlude_wire")
-            #hide ssao for now, will expose again when it's ready
-            #col.prop(view, "ssao")
+            col.prop(view, "ssao")
             col.prop(view, "depth_of_field")
             if view.depth_of_field:
                 subcol = col.column(align=True)
diff --git a/source/blender/gpu/shaders/gpu_shader_fx_frag.glsl 
b/source/blender/gpu/shaders/gpu_shader_fx_frag.glsl
index 965b5d7..198eb45 100644
--- a/source/blender/gpu/shaders/gpu_shader_fx_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_fx_frag.glsl
@@ -15,48 +15,46 @@ uniform vec2 dof_params;
 
 #define NUM_SAMPLES 5
 
-void calculate_ss_normal (in float depth, out vec4 color)
+vec3 calculate_ss_normal(in vec4 viewposition)
 {
-       vec2 offset_co = vec2(1.0/screendim.x, 1.0/screendim.y);
-       float depthx = texture2D(depthbuffer, framecoords.xy + 
vec2(offset_co.x, 0.0)).r;
-       float depthy = texture2D(depthbuffer, framecoords.xy + vec2(0.0, 
offset_co.y)).r;
+    vec3 normal = cross(normalize(dFdx(viewposition.xyz)), 
+                        normalize(dFdy(viewposition.xyz)));
+    normalize(normal);
+    normal = normal * 0.5 + vec3(0.5);
+    return normal;
+}
 
-       // This is essentially a cross product multiplied screendim.x * 
screendim.y
-       // If we were to use normal multiplication then we could easily get out 
of half-float range
-       vec3 normal = vec3(screendim.y*(depthx - depth), screendim.x*(depthy - 
depth), 1.0);
-       normalize(normal);
-       normal = normal * 0.5 + vec3(0.5);
-       color = vec4(normal, 1.0);
+float calculate_dof_coc(in vec4 viewposition, inout vec3 normal)
+{
+    float dist = length(viewposition);
+    float coc = dof_params.x * abs(1.0 - dof_params.y / dist);
+    
+    coc = clamp(coc, 0.0, 1.0);
+    
+    return coc;
 }
 
 
 void main()
 {
-       float depth = texture2D(depthbuffer, framecoords.xy).r;
+    vec3 normal;
+    float depth = texture2D(depthbuffer, framecoords.xy).r;
        
-       //First we need to calculate the view space distance from the shader 
inputs
-       //This will unfortunately depend on the precision of the depth buffer 
which is not linear
-       vec2 norm_scr = framecoords.xy * 2.0 - 1.0;
-       vec4 viewposition = vec4(norm_scr.x, norm_scr.y, depth, 1.0);
-
-       // convert to view space now
-       viewposition = gl_ProjectionMatrixInverse * viewposition;
-       viewposition = viewposition / viewposition.w;
-
-       //vec3 normal = cross(dFdx(viewposition.xyz), dFdy(viewposition.xyz));
-       //normalize(normal);
-       //normal.z = -normal.z;
-       //normal = normal * 0.5 + vec3(0.5);
-
-        //calculate circle of confusion
-       float dist = length(viewposition);
-       float coc = dof_params.x * abs(1.0 - dof_params.y / dist);
-
-        coc = clamp(coc, 0.0, 1.0);
-        
-        // blend between blurred-non blurred images based on coc       
-        vec4 color = coc * vec4(1.0, 0.0, 0.0, 1.0) * 
texture2D(blurredcolorbuffer, framecoords.xy) +
-                (1.0 - coc) * vec4(0.0, 1.0, 0.0, 1.0) * 
texture2D(colorbuffer, framecoords.xy);
-
-       gl_FragColor = vec4(color.xyz, 1.0);
+    //First we need to calculate the view space distance from the shader inputs
+    //This will unfortunately depend on the precision of the depth buffer 
which is not linear
+    vec2 norm_scr = framecoords.xy * 2.0 - 1.0;
+    vec4 viewposition = vec4(norm_scr.x, norm_scr.y, depth, 1.0);
+    
+    // convert to view space now
+    viewposition = gl_ProjectionMatrixInverse * viewposition;
+    viewposition = viewposition / viewposition.w;
+    
+    normal = calculate_ss_normal(viewposition);
+    vec3 color = normal;
+    
+    // blend between blurred-non blurred images based on coc   
+    //vec4 color = coc * texture2D(blurredcolorbuffer, framecoords.xy) +
+    //       (1.0 - coc) * texture2D(colorbuffer, framecoords.xy);
+    
+    gl_FragColor = vec4(color.xyz, 1.0);
 }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to