[Bf-blender-cvs] [24fd03d0c2f] blender2.8: Workbench: Reduce VRAM usage depending on mode

Clément Foucault noreply at git.blender.org
Mon Dec 3 17:19:16 CET 2018


Commit: 24fd03d0c2fc5f49bc3813afce7ac5d67fc762bd
Author: Clément Foucault
Date:   Mon Dec 3 00:36:54 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB24fd03d0c2fc5f49bc3813afce7ac5d67fc762bd

Workbench: Reduce VRAM usage depending on mode

We exploit the fact that we are using the metallic workflow for material
and pass the metallic parameter instead of the specular color.

Pack the front facing bit in the color buffer only for matcap display.

Change buffer formats to use less bytes as possible.

Also don't request buffers that we won't use.

Saved 40MB on 2K screen on StudioLight + Shadows + Specular Lighting.

Includes several cleanups.

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

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_forward_transparent_accum_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_effect_taa.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
M	source/blender/draw/intern/draw_manager_texture.c
M	source/blender/gpu/intern/gpu_texture.c

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

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 b52d7d31e61..769d453bb18 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
@@ -61,13 +61,7 @@ void main()
 #ifdef USE_CAVITY
 	float depth = texelFetch(depthBuffer, texel, 0).x;
 	vec3 position = get_view_space_from_depth(screenco, depth);
-
-	vec4 diffuse_color = texelFetch(colorBuffer, texel, 0);
-	vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg);
-	if (diffuse_color.a == 0.0) {
-		normal_viewport = -normal_viewport;
-	}
-
+	vec3 normal_viewport = workbench_normal_decode(texelFetch(normalBuffer, texel, 0).rg);
 
 	ssao_factors(depth, normal_viewport, position, screenco, cavity, edges);
 #endif
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 982c3821030..451d509eeee 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
@@ -19,9 +19,11 @@ float bayer_dither_noise() {
 	return dither_mat4x4[tx1.x][tx1.y];
 }
 
+#ifdef WORKBENCH_ENCODE_NORMALS
+
 /* From http://aras-p.info/texts/CompactNormalStorage.html
  * Using Method #4: Spheremap Transform */
-vec3 normal_decode(vec2 enc)
+vec3 workbench_normal_decode(vec2 enc)
 {
 	vec2 fenc = enc.xy * 4.0 - 2.0;
 	float f = dot(fenc, fenc);
@@ -34,38 +36,18 @@ vec3 normal_decode(vec2 enc)
 
 /* From http://aras-p.info/texts/CompactNormalStorage.html
  * Using Method #4: Spheremap Transform */
-vec2 normal_encode(vec3 n)
+vec2 workbench_normal_encode(vec3 n)
 {
 	float p = sqrt(n.z * 8.0 + 8.0);
-	return vec2(n.xy / p + 0.5);
+	n.xy = clamp(n.xy / p + 0.5, 0.0, 1.0);
+	return n.xy;
 }
 
-void fresnel(vec3 I, vec3 N, float ior, out float kr)
-{
-	float cosi = clamp(dot(I, N), -1.0, 1.0);
-	float etai = 1.0;
-	float etat = ior;
-	if (cosi > 0) {
-		etat = 1.0;
-		etai = ior;
-	}
-
-	// Compute sini using Snell's law
-	float sint = etai / etat * sqrt(max(0.0, 1.0 - cosi * cosi));
-	// Total internal reflection
-	if (sint >= 1) {
-		kr = 1;
-	}
-	else {
-		float cost = sqrt(max(0.0, 1.0 - sint * sint));
-		cosi = abs(cosi);
-		float Rs = ((etat * cosi) - (etai * cost)) / ((etat * cosi) + (etai * cost));
-		float Rp = ((etai * cosi) - (etat * cost)) / ((etai * cosi) + (etat * cost));
-		kr = (Rs * Rs + Rp * Rp) / 2;
-	}
-	// As a consequence of the conservation of energy, transmittance is given by:
-	// kt = 1 - kr;
-}
+#else
+/* Well just do nothing... */
+#  define workbench_normal_encode(a) (a)
+#  define workbench_normal_decode(a) (a)
+#endif /* WORKBENCH_ENCODE_NORMALS */
 
 float calculate_transparent_weight(float z, float alpha)
 {
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 53315b8c132..d0281f6c85c 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
@@ -26,12 +26,10 @@ float calculate_curvature(usampler2D objectId, sampler2D normalBuffer, ivec2 tex
 	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;
-#endif
+	normal_up    = workbench_normal_decode(normal_up   ).rg;
+	normal_down  = workbench_normal_decode(normal_down ).rg;
+	normal_left  = workbench_normal_decode(normal_left ).rg;
+	normal_right = workbench_normal_decode(normal_right).rg;
 
 	float normal_diff = ((normal_up.g - normal_down.g) + (normal_right.r - normal_left.r));
 
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 e383d1b1939..96537c47f11 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
@@ -5,7 +5,7 @@ uniform mat4 ViewMatrixInverse;
 
 uniform usampler2D objectId;
 uniform sampler2D colorBuffer;
-uniform sampler2D specularBuffer;
+uniform sampler2D metallicBuffer;
 uniform sampler2D normalBuffer;
 /* normalBuffer contains viewport normals */
 uniform sampler2D cavityBuffer;
@@ -28,6 +28,7 @@ void main()
 	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
 	uint object_id = texelFetch(objectId, texel, 0).r;
 
+	/* TODO separate this into its own shader. */
 #ifndef V3D_SHADING_OBJECT_OUTLINE
 	if (object_id == NO_OBJECT_ID) {
 		fragColor = vec4(background_color(world_data, uv_viewport.y), world_data.background_alpha);
@@ -52,41 +53,42 @@ void main()
 	}
 #endif /* !V3D_SHADING_OBJECT_OUTLINE */
 
-	vec4 diffuse_color = texelFetch(colorBuffer, texel, 0);
+	vec4 base_color = texelFetch(colorBuffer, texel, 0);
 
 /* Do we need normals */
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
-#  ifdef WORKBENCH_ENCODE_NORMALS
-	vec3 normal_viewport = normal_decode(texelFetch(normalBuffer, texel, 0).rg);
-	if (diffuse_color.a == 0.0) {
-		normal_viewport = -normal_viewport;
-	}
-#  else /* WORKBENCH_ENCODE_NORMALS */
-	vec3 normal_viewport = texelFetch(normalBuffer, texel, 0).rgb;
-#  endif /* WORKBENCH_ENCODE_NORMALS */
+	vec3 normal_viewport = workbench_normal_decode(texelFetch(normalBuffer, texel, 0).rg);
 #endif
 
 	vec3 I_vs = view_vector_from_screen_uv(uv_viewport, viewvecs, ProjectionMatrix);
 
 	/* -------- SHADING --------- */
 #ifdef V3D_LIGHTING_FLAT
-	vec3 shaded_color = diffuse_color.rgb;
+	vec3 shaded_color = base_color.rgb;
 
 #elif defined(V3D_LIGHTING_MATCAP)
+	/* When using matcaps, the basecolor alpha is the backface sign. */
+	normal_viewport = (base_color.a > 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;
-	vec3 shaded_color = matcap * diffuse_color.rgb;
+	vec3 shaded_color = matcap * base_color.rgb;
 
 #elif defined(V3D_LIGHTING_STUDIO)
 
 #  ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
-	vec4 specular_data = texelFetch(specularBuffer, texel, 0);
+	float metallic = texelFetch(metallicBuffer, texel, 0).r;
+	float roughness = base_color.a;
+	vec3 specular_color = mix(vec3(0.05), base_color.rgb, metallic);
+	vec3 diffuse_color = mix(base_color.rgb, vec3(0.0), metallic);
 #  else
-	vec4 specular_data = vec4(0.0);
+	float roughness = 0.0;
+	vec3 specular_color = vec3(0.0);
+	vec3 diffuse_color = base_color.rgb;
 #  endif
+
 	vec3 shaded_color = get_world_lighting(world_data,
-	                                       diffuse_color.rgb, specular_data.rgb, specular_data.a,
+	                                       diffuse_color, specular_color, roughness,
 	                                       normal_viewport, I_vs);
 #endif
 
@@ -98,8 +100,6 @@ void main()
 
 #ifdef V3D_SHADING_SHADOW
 	float light_factor = -dot(normal_viewport, world_data.shadow_direction_vs.xyz);
-	/* The step function might be ok for meshes but it's
-	 * clearly not the case for hairs. Do smoothstep in this case. */
 	float shadow_mix = smoothstep(shadowFocus, shadowShift, light_factor);
 	shaded_color *= mix(lightMultiplier, shadowMultiplier, shadow_mix);
 #endif
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
index c00edb06100..d42b6bde791 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
@@ -9,8 +9,8 @@ uniform float alpha = 0.5;
 uniform vec2 invertedViewportSize;
 uniform vec4 viewvecs[3];
 
-uniform vec4 materialDiffuseColor;
-uniform vec4 materialSpecularColor;
+uniform vec3 materialDiffuseColor;
+uniform vec3 materialSpecularColor;
 uniform float materialRoughness;
 
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
@@ -40,7 +40,7 @@ void main()
 		discard;
 	}
 #else
-	diffuse_color = materialDiffuseColor;
+	diffuse_color = vec4(materialDiffuseColor, 1.0);
 #endif /* V3D_SHADING_TEXTURE_COLOR */
 
 	vec2 uv_viewport = gl_FragCoord.xy * invertedViewportSize;
@@ -62,7 +62,7 @@ void main()
 
 #elif defined(V3D_LIGHTING_STUDIO)
 	vec3 shaded_color = get_world_lighting(world_data,
-	                                       diffuse_color.rgb, materialSpecularColor.rgb, materialRoughness,
+	                                       diffuse_color.rgb, materialSpecularColor, materialRoughness,
 	                                       nor, I_vs);
 #endif
 
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 5f622b00bca..ee968c4eb02 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
@@ -1,7 +1,7 @@
 uniform int object_id = 0;
 
-uniform vec4 materialDiffuseColor;
-uniform vec4 materialSpecularColor;
+uniform vec3 materialDiffuseColor;
+uniform float materialMetallic;
 uniform float materialRoughness;
 
 #ifdef V3D_SHADING_TEXTURE_COLOR
@@ -23,9 +23,9 @@ flat in float hair_rand;
 #endif
 
 layout(location=0) out uint objectId;
-layout(location=1) out vec4 diffuseColor;
+layout(location=1) out vec4 colorRoughness;
 #ifdef V3D_SHADING_SPECULAR_HIGHLIGHT
-layout(location=2) out vec4 specularColor;
+layout(location=2) out float metallic;
 #endif
 #ifdef NORMAL_VIEWPORT_PASS_ENABLED
 #  ifdef 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list