[Bf-blender-cvs] [7ffde286be0] blender2.8: Workbench: Cleanups and reduce shader variations

Clément Foucault noreply at git.blender.org
Wed Dec 5 02:51:57 CET 2018


Commit: 7ffde286be0774e24ea04b4acaad6c6e4ae16bfe
Author: Clément Foucault
Date:   Wed Dec 5 02:07:23 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB7ffde286be0774e24ea04b4acaad6c6e4ae16bfe

Workbench: Cleanups and reduce shader variations

Also optimize deferred engine by only outputing material data if needed.
This make the bare flat shading mode (no effects) only a depth prepass.

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

M	source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
M	source/blender/draw/engines/workbench/shaders/workbench_forward_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_forward.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_common_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
index b8c90162c51..7aa41e1a537 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -21,9 +21,11 @@ float bayer_dither_noise() {
 
 #ifdef WORKBENCH_ENCODE_NORMALS
 
+#define WB_Normal vec2
+
 /* From http://aras-p.info/texts/CompactNormalStorage.html
  * Using Method #4: Spheremap Transform */
-vec3 workbench_normal_decode(vec2 enc)
+vec3 workbench_normal_decode(WB_Normal enc)
 {
 	vec2 fenc = enc.xy * 4.0 - 2.0;
 	float f = dot(fenc, fenc);
@@ -36,7 +38,7 @@ vec3 workbench_normal_decode(vec2 enc)
 
 /* From http://aras-p.info/texts/CompactNormalStorage.html
  * Using Method #4: Spheremap Transform */
-vec2 workbench_normal_encode(vec3 n)
+WB_Normal workbench_normal_encode(vec3 n)
 {
 	float p = sqrt(n.z * 8.0 + 8.0);
 	n.xy = clamp(n.xy / p + 0.5, 0.0, 1.0);
@@ -44,6 +46,7 @@ vec2 workbench_normal_encode(vec3 n)
 }
 
 #else
+#define WB_Normal vec3
 /* Well just do nothing... */
 #  define workbench_normal_encode(a) (a)
 #  define workbench_normal_decode(a) (a)
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 5a895ab65ec..40e166bc7ac 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
@@ -17,6 +17,8 @@ uniform float lightMultiplier;
 uniform float shadowShift = 0.1;
 uniform float shadowFocus = 1.0;
 
+uniform vec3 materialSingleColor;
+
 layout(std140) uniform world_block {
 	WorldData world_data;
 };
@@ -26,8 +28,18 @@ void main()
 	ivec2 texel = ivec2(gl_FragCoord.xy);
 	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
 
+	float roughness, metallic;
+	vec3 base_color;
+
+#ifndef MATDATA_PASS_ENABLED
+	base_color = materialSingleColor;
+	metallic = 0.0;
+	roughness = 0.5;
+#else
 	vec4 material_data = texelFetch(materialBuffer, texel, 0);
-	vec3 base_color = material_data.rgb;
+	base_color = material_data.rgb;
+	workbench_float_pair_decode(material_data.a, roughness, metallic);
+#endif
 
 /* Do we need normals */
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
@@ -41,9 +53,8 @@ void main()
 	vec3 shaded_color = base_color;
 
 #elif defined(V3D_LIGHTING_MATCAP)
-	/* When using matcaps, the material_data.a is the backface sign. */
-	float flipped_nor = material_data.a;
-	normal_viewport = (flipped_nor > 0.0) ? normal_viewport : -normal_viewport;
+	/* When using matcaps, the metallic is the backface sign. */
+	normal_viewport = (metallic > 0.0) ? normal_viewport : -normal_viewport;
 	bool flipped = world_data.matcap_orientation != 0;
 	vec2 matcap_uv = matcap_uv_compute(I_vs, normal_viewport, flipped);
 	vec3 matcap = textureLod(matcapImage, matcap_uv, 0.0).rgb;
@@ -52,12 +63,10 @@ void main()
 #elif defined(V3D_LIGHTING_STUDIO)
 
 #  ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
-	float roughness, metallic;
-	workbench_float_pair_decode(material_data.a, roughness, metallic);
 	vec3 specular_color = mix(vec3(0.05), base_color, metallic);
 	vec3 diffuse_color = mix(base_color, vec3(0.0), metallic);
 #  else
-	float roughness = 0.0;
+	roughness = 0.0;
 	vec3 specular_color = vec3(0.0);
 	vec3 diffuse_color = base_color;
 #  endif
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
index 1d9f37274bd..cb5516ca34f 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
@@ -13,25 +13,23 @@ void main()
 {
 	ivec2 texel = ivec2(gl_FragCoord.xy);
 	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
-	uint object_id = texelFetch(objectId, texel, 0).r;
 
 	/* Listing 4 */
 	vec4 trans_accum = texelFetch(transparentAccum, texel, 0);
 	float trans_revealage = trans_accum.a;
 	trans_accum.a = texelFetch(transparentRevealage, texel, 0).r;
 
-#ifdef V3D_SHADING_OBJECT_OUTLINE
-	float outline = calculate_object_outline(objectId, texel, object_id);
-#else /* V3D_SHADING_OBJECT_OUTLINE */
-	float outline = 1.0;
-#endif /* V3D_SHADING_OBJECT_OUTLINE */
 	vec3 bg_color = background_color(world_data, uv_viewport.y);
 
 	/* TODO: Bypass the whole shader if there is no xray pass and no outline pass. */
 	vec3 trans_color = trans_accum.rgb / clamp(trans_accum.a, 1e-4, 5e4);
 	vec3 color = mix(trans_color, bg_color, trans_revealage);
 
+#ifdef V3D_SHADING_OBJECT_OUTLINE
+	uint object_id = texelFetch(objectId, texel, 0).r;
+	float outline = calculate_object_outline(objectId, texel, object_id);
 	color = mix(world_data.object_outline_color.rgb, color, outline);
+#endif
 
 	fragColor = vec4(color, 1.0);
 }
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 93170037c4b..722add22a89 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -4,69 +4,70 @@ uniform vec3 materialDiffuseColor;
 uniform float materialMetallic;
 uniform float materialRoughness;
 
-#ifdef V3D_SHADING_TEXTURE_COLOR
 uniform sampler2D image;
 uniform float ImageTransparencyCutoff = 0.1;
 
-#endif
-
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
 in vec3 normal_viewport;
-#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
+#endif
 
 #ifdef V3D_SHADING_TEXTURE_COLOR
 in vec2 uv_interp;
-#endif /* V3D_SHADING_TEXTURE_COLOR */
+#endif
 
 #ifdef HAIR_SHADER
 flat in float hair_rand;
 #endif
 
-layout(location=0) out uint objectId;
-layout(location=1) out vec4 materialData;
+#ifdef MATDATA_PASS_ENABLED
+layout(location=0) out vec4 materialData;
+#endif
+#ifdef OBJECT_ID_PASS_ENABLED
+layout(location=1) out uint objectId;
+#endif
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
-#  ifdef WORKBENCH_ENCODE_NORMALS
-layout(location=2) out vec2 normalViewport;
-#  else /* WORKBENCH_ENCODE_NORMALS */
-layout(location=2) out vec3 normalViewport;
-#  endif /* WORKBENCH_ENCODE_NORMALS */
-#endif /* NORMAL_VIEWPORT_PASS_ENABLED */
+layout(location=2) out WB_Normal normalViewport;
+#endif
 
 void main()
 {
-	objectId = uint(object_id);
+#ifdef MATDATA_PASS_ENABLED
+	float metallic, roughness;
+	vec4 color;
 
-	vec4 color_roughness;
-#ifdef V3D_SHADING_TEXTURE_COLOR
-	color_roughness = texture(image, uv_interp);
-	if (color_roughness.a < ImageTransparencyCutoff) {
+#  ifdef V3D_SHADING_TEXTURE_COLOR
+	color = texture(image, uv_interp);
+	if (color.a < ImageTransparencyCutoff) {
 		discard;
 	}
-	color_roughness.a = materialRoughness;
-#else
-	color_roughness = vec4(materialDiffuseColor, materialRoughness);
-#endif /* V3D_SHADING_TEXTURE_COLOR */
-
-#ifdef HAIR_SHADER
-	float hair_color_variation = hair_rand * 0.1;
-	color_roughness = clamp(color_roughness - hair_color_variation, 0.0, 1.0);
-#endif
-
-	float metallic;
-#ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
-#  ifdef HAIR_SHADER
-	metallic = clamp(materialMetallic - hair_color_variation, 0.0, 1.0);
 #  else
-	metallic = materialMetallic;
+	color.rgb = materialDiffuseColor;
 #  endif
-#elif defined(V3D_LIGHTING_MATCAP)
+
+#  ifdef V3D_LIGHTING_MATCAP
 	/* Encode front facing in metallic channel. */
 	metallic = float(gl_FrontFacing);
-	color_roughness.a = 0.0;
-#endif
+	roughness = 0.0;
+#  else
+	metallic = materialMetallic;
+	roughness = materialRoughness;
+#  endif
 
-	materialData.rgb = color_roughness.rgb;
-	materialData.a   = workbench_float_pair_encode(color_roughness.a, metallic);
+#  ifdef HAIR_SHADER
+	/* Add some variation to the hairs to avoid uniform look. */
+	float hair_variation = hair_rand * 0.1;
+	color = clamp(color - hair_variation, 0.0, 1.0);
+	metallic = clamp(materialMetallic - hair_variation, 0.0, 1.0);
+	roughness = clamp(materialRoughness - hair_variation, 0.0, 1.0);
+#  endif
+
+	materialData.rgb = color.rgb;
+	materialData.a   = workbench_float_pair_encode(roughness, metallic);
+#endif /* MATDATA_PASS_ENABLED */
+
+#ifdef OBJECT_ID_PASS_ENABLED
+	objectId = uint(object_id);
+#endif
 
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
 	vec3 n = (gl_FrontFacing) ? normal_viewport : -normal_viewport;
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 1e401b278be..7d551114f2e 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -46,6 +46,7 @@
 
 #include "GPU_shader.h"
 #include "GPU_texture.h"
+#include "GPU_extensions.h"
 
 #include "../eevee/eevee_lut.h" /* TODO find somewhere to share blue noise Table */
 
@@ -58,8 +59,8 @@
 #endif
 
 static struct {
-	struct GPUShader *prepass_sh_cache[MAX_SHADERS];
-	struct GPUShader *composite_sh_cache[MAX_SHADERS];
+	struct GPUShader *prepass_sh_cache[MAX_PREPASS_SHADERS];
+	struct GPUShader *composite_sh_cache[MAX_COMPOSITE_SHADERS];
 	struct GPUShader *cavity_sh[MAX_CAVITY_SHADERS];
 	struct GPUShader *background_sh[2];
 	struct GPUShader *ghost_resolve_sh;
@@ -215,64 +216,63 @@ static GPUShader *workbench_cavity_shader_get(bool cavity, bool curvature)
 	return *sh;
 }
 
-static void ensure_deferred_shaders(WORKBENCH_PrivateData *wpd, int index, bool use_textures, bool is_hair)
+static GPUShader *ensure_deferred_prepass_shader(WORKBENCH_PrivateData *wpd, bool use_textures, bool is_hair)
 {
+	int index = workbench_material_get_prepass_shader_index(wpd, use_textures, is_hair);
 	if (e_data.prepass_sh_cache[index] == NULL) {
 		char *defines = workbench_material_build_defines(wpd, use_textures, is_hair);
-		char *composite_frag = workbench_build_composite_frag(wpd);
 		char *prepass_vert = workbench_build_prepass_vert(is_hair);
 		char *prepass_frag = workbench_build_prepass_frag();
 		e_data.prepass_sh_cache[index] = DRW_shader_create(
 		        prepass_ver

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list