[Bf-blender-cvs] [6a4f5f6eb44] blender2.8: Workbench: Cleanups & Simplifications

Clément Foucault noreply at git.blender.org
Fri Nov 30 02:02:42 CET 2018


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. @@



More information about the Bf-blender-cvs mailing list