Commit: 6a4f5f6eb44b3dacff51ae8c152689e8ddf6e7b2
Author: Clément Foucault
Date:   Fri Nov 30 01:53:50 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB6a4f5f6eb44b3dacff51ae8c152689e8ddf6e7b2

Workbench: Cleanups & Simplifications

* Move the curvature computation to the cavity pass: One can argue it's not
  the best performance wise (it gets a tiny perf pernalty if it is done
  alone without the ssao), but it make the code cleaner and reduce
  considerably the number of shader variation possible.
* Lower shader variation to 2^8 instead of 2^12

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

M       source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
M       source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
M       
source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
M       source/blender/draw/engines/workbench/workbench_deferred.c
M       source/blender/draw/engines/workbench/workbench_materials.c
M       source/blender/draw/engines/workbench/workbench_private.h

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

diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
index fafb164a694..b52d7d31e61 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
@@ -3,6 +3,7 @@ out vec4 fragColor;
 uniform sampler2D depthBuffer;
 uniform sampler2D colorBuffer;
 uniform sampler2D normalBuffer;
+uniform usampler2D objectId;
 
 uniform vec2 invertedViewportSize;
 uniform mat4 WinMatrix; /* inverse WinMatrix */
@@ -10,6 +11,7 @@ uniform mat4 WinMatrix; /* inverse WinMatrix */
 uniform vec4 viewvecs[3];
 uniform vec4 ssao_params;
 uniform vec4 ssao_settings;
+uniform vec2 curvature_settings;
 uniform sampler2D ssao_jitter;
 
 layout(std140) uniform samples_block {
@@ -23,7 +25,7 @@ layout(std140) uniform samples_block {
 #define ssao_distance       ssao_settings.x
 #define ssao_factor_cavity  ssao_settings.y
 #define ssao_factor_edge    ssao_settings.z
-#define ssao_attenuation    ssao_settings.a
+#define ssao_attenuation    ssao_settings.w
 
 vec3 get_view_space_from_depth(in vec2 uvcoords, in float depth)
 {
@@ -54,6 +56,9 @@ void main()
        vec2 screenco = vec2(gl_FragCoord.xy) * invertedViewportSize;
        ivec2 texel = ivec2(gl_FragCoord.xy);
 
+       float cavity = 0.0, edges = 0.0, curvature = 0.0;
+
+#ifdef USE_CAVITY
        float depth = texelFetch(depthBuffer, texel, 0).x;
        vec3 position = get_view_space_from_depth(screenco, depth);
 
@@ -63,8 +68,16 @@ void main()
                normal_viewport = -normal_viewport;
        }
 
-       float cavity = 0.0, edges = 0.0;
+
        ssao_factors(depth, normal_viewport, position, screenco, cavity, edges);
+#endif
+
+#ifdef USE_CURVATURE
+       curvature = calculate_curvature(objectId, normalBuffer, texel, 
curvature_settings.x, curvature_settings.y);
+#endif
+
+       float final_cavity_factor = clamp((1.0 - cavity) * (1.0 + edges) * (1.0 
+ curvature), 0.0, 4.0);
 
-       fragColor = vec4(cavity, edges, 0.0, 1.0);
+       /* Using UNORM render target so compress the range. */
+       fragColor = vec4(final_cavity_factor / CAVITY_BUFFER_RANGE);
 }
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index c56e02e72d6..982c3821030 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -2,6 +2,8 @@
 #define EPSILON 0.00001
 #define M_PI 3.14159265358979323846
 
+#define CAVITY_BUFFER_RANGE 4.0
+
 /* 4x4 bayer matrix prepared for 8bit UNORM precision error. */
 #define P(x) (((x + 0.5) * (1.0 / 16.0) - 0.5) * (1.0 / 255.0))
 const vec4 dither_mat4x4[4] = vec4[4](
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
index 6b693675f84..53315b8c132 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
@@ -4,37 +4,40 @@
 
 float curvature_soft_clamp(float curvature, float control)
 {
-    if (curvature < 0.5 / control)
-        return curvature * (1.0 - curvature * control);
-    return 0.25 / control;
+       if (curvature < 0.5 / control) {
+               return curvature * (1.0 - curvature * control);
+       }
+       return 0.25 / control;
 }
 
 float calculate_curvature(usampler2D objectId, sampler2D normalBuffer, ivec2 
texel, float ridge, float valley)
 {
-    uint object_up    = texelFetchOffset(objectId, texel, 0, ivec2(0,  
CURVATURE_OFFSET)).r;
-    uint object_down  = texelFetchOffset(objectId, texel, 0, ivec2(0, 
-CURVATURE_OFFSET)).r;
-    uint object_left  = texelFetchOffset(objectId, texel, 0, 
ivec2(-CURVATURE_OFFSET, 0)).r;
-    uint object_right = texelFetchOffset(objectId, texel, 0, ivec2( 
CURVATURE_OFFSET, 0)).r;
+       uint object_up    = texelFetchOffset(objectId, texel, 0, ivec2(0,  
CURVATURE_OFFSET)).r;
+       uint object_down  = texelFetchOffset(objectId, texel, 0, ivec2(0, 
-CURVATURE_OFFSET)).r;
+       uint object_left  = texelFetchOffset(objectId, texel, 0, 
ivec2(-CURVATURE_OFFSET, 0)).r;
+       uint object_right = texelFetchOffset(objectId, texel, 0, ivec2( 
CURVATURE_OFFSET, 0)).r;
 
-    if((object_up != object_down) || (object_right != object_left)) {
-        return 0.0;
-    }
+       if((object_up != object_down) || (object_right != object_left)) {
+               return 0.0;
+       }
 
-    vec2 normal_up    = texelFetchOffset(normalBuffer, texel, 0, ivec2(0,  
CURVATURE_OFFSET)).rg;
-    vec2 normal_down  = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, 
-CURVATURE_OFFSET)).rg;
-    vec2 normal_left  = texelFetchOffset(normalBuffer, texel, 0, 
ivec2(-CURVATURE_OFFSET, 0)).rg;
-    vec2 normal_right = texelFetchOffset(normalBuffer, texel, 0, ivec2( 
CURVATURE_OFFSET, 0)).rg;
+       vec2 normal_up    = texelFetchOffset(normalBuffer, texel, 0, ivec2(0,  
CURVATURE_OFFSET)).rg;
+       vec2 normal_down  = texelFetchOffset(normalBuffer, texel, 0, ivec2(0, 
-CURVATURE_OFFSET)).rg;
+       vec2 normal_left  = texelFetchOffset(normalBuffer, texel, 0, 
ivec2(-CURVATURE_OFFSET, 0)).rg;
+       vec2 normal_right = texelFetchOffset(normalBuffer, texel, 0, ivec2( 
CURVATURE_OFFSET, 0)).rg;
 
 #ifdef WORKBENCH_ENCODE_NORMALS
-    normal_up    = normal_decode(normal_up   ).rg;
-    normal_down  = normal_decode(normal_down ).rg;
-    normal_left  = normal_decode(normal_left ).rg;
-    normal_right = normal_decode(normal_right).rg;
+       normal_up    = normal_decode(normal_up   ).rg;
+       normal_down  = normal_decode(normal_down ).rg;
+       normal_left  = normal_decode(normal_left ).rg;
+       normal_right = normal_decode(normal_right).rg;
 #endif
 
-    float normal_diff = ((normal_up.g - normal_down.g) + (normal_right.r - 
normal_left.r));
+       float normal_diff = ((normal_up.g - normal_down.g) + (normal_right.r - 
normal_left.r));
 
-    if (normal_diff < 0)
-        return -2.0 * curvature_soft_clamp(-normal_diff, valley);
-    return 2.0 * curvature_soft_clamp(normal_diff, ridge);
+       if (normal_diff < 0) {
+               return -2.0 * curvature_soft_clamp(-normal_diff, valley);
+       }
+
+       return 2.0 * curvature_soft_clamp(normal_diff, ridge);
 }
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
 
b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
index 54475715d07..310169bdf5d 100644
--- 
a/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
+++ 
b/source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
@@ -74,9 +74,8 @@ void main()
 #elif defined(V3D_LIGHTING_MATCAP)
        bool flipped = world_data.matcap_orientation != 0;
        vec2 matcap_uv = matcap_uv_compute(I_vs, normal_viewport, flipped);
-       vec3 object_color = texelFetch(specularBuffer, texel, 0).rgb;
        vec3 matcap = textureLod(matcapImage, matcap_uv, 0.0).rgb;
-       vec3 shaded_color = matcap * object_color;
+       vec3 shaded_color = matcap * diffuse_color.rgb;
 
 #elif defined(V3D_LIGHTING_STUDIO)
 
@@ -91,15 +90,9 @@ void main()
 #endif
 
        /* -------- POST EFFECTS --------- */
-#ifdef V3D_SHADING_SSAO
-       vec2 cavity = texelFetch(cavityBuffer, texel, 0).rg;
-       shaded_color *= 1.0 - cavity.x;
-       shaded_color *= 1.0 + cavity.y;
-#endif
-
-#ifdef V3D_SHADING_CURVATURE
-       float curvature = calculate_curvature(objectId, normalBuffer, texel, 
world_data.curvature_ridge, world_data.curvature_valley);
-       shaded_color *= curvature + 1.0;
+#ifdef WB_CAVITY
+       /* Using UNORM texture so decompress the range */
+       shaded_color *= texelFetch(cavityBuffer, texel, 0).r * 
CAVITY_BUFFER_RANGE;
 #endif
 
 #ifdef V3D_SHADING_SHADOW
diff --git 
a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl 
b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
index 5b4a7815dc2..5f622b00bca 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -24,7 +24,9 @@ flat in float hair_rand;
 
 layout(location=0) out uint objectId;
 layout(location=1) out vec4 diffuseColor;
+#ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
 layout(location=2) out vec4 specularColor;
+#endif
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
 #  ifdef WORKBENCH_ENCODE_NORMALS
 layout(location=3) out vec2 normalViewport;
@@ -49,10 +51,6 @@ void main()
        }
 #else
        diffuseColor = vec4(materialDiffuseColor.rgb, 0.0);
-#  ifdef STUDIOLIGHT_TYPE_MATCAP
-       specularColor = vec4(materialDiffuseColor.rgb, 0.0);
-
-#  endif
 #endif /* V3D_SHADING_TEXTURE_COLOR */
 
 #ifdef HAIR_SHADER
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c 
b/source/blender/draw/engines/workbench/workbench_deferred.c
index b801181e1fc..1ca76da672a 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -59,7 +59,7 @@
 static struct {
        struct GPUShader *prepass_sh_cache[MAX_SHADERS];
        struct GPUShader *composite_sh_cache[MAX_SHADERS];
-       struct GPUShader *cavity_sh;
+       struct GPUShader *cavity_sh[MAX_CAVITY_SHADERS];
        struct GPUShader *ghost_resolve_sh;
        struct GPUShader *shadow_fail_sh;
        struct GPUShader *shadow_fail_manifold_sh;
@@ -167,13 +167,23 @@ static char *workbench_build_prepass_vert(bool is_hair)
        return str;
 }
 
-static char *workbench_build_cavity_frag(void)
+static char *workbench_build_cavity_frag(bool cavity, bool curvature, bool 
high_dpi)
 {
        char *str = NULL;
 
        DynStr *ds = BLI_dynstr_new();
 
+       if (cavity) {
+               BLI_dynstr_append(ds, "#define USE_CAVITY\n");
+       }
+       if (curvature) {
+               BLI_dynstr_append(ds, "#define USE_CURVATURE\n");
+       }
+       if (high_dpi) {
+               BLI_dynstr_append(ds, "#define CURVATURE_OFFSET 2\n");
+       }
        BLI_dynstr_append(ds, datatoc_workbench_common_lib_glsl);
+       BLI_dynstr_append(ds, datatoc_workbench_curvature_lib_glsl);
        BLI_dynstr_append(ds, datatoc_workbench_cavity_frag_glsl);
        BLI_dynstr_append(ds, datatoc_workbench_cavity_lib_glsl);
 
@@ -182,6 +192,23 @@ static char *workbench_build_cavity_frag(void)
        return str;
 }
 
+static GPUShader *workbench_cavity_shader_get(bool cavity, bool curvature)
+{


@@ Diff output truncated at 10240 characters. @@

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

Reply via email to