[Bf-blender-cvs] [518e7685790] blender2.8: Fix T52441: Principle BSDF clearcoat

Dalai Felinto noreply at git.blender.org
Tue Sep 5 16:40:34 CEST 2017


Commit: 518e7685790f28789bbe795f370ee3b1a5f776c6
Author: Dalai Felinto
Date:   Tue Sep 5 16:33:08 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB518e7685790f28789bbe795f370ee3b1a5f776c6

Fix T52441: Principle BSDF clearcoat

Since the change to prevent shader recompilation at every update, we got
a regression when clearcoat was used.

Basically at the shader build time we would determine if the shader
needed clear coat, and if it didin't, it would build a different GLSL
program.

However if later the user updated the clearcoat value so that it would
then require the full clearcoat shader, the user wouldn't get it until
manually forcing the shader to recompile, or reopening the file.

We now handle the optimization in the GLSL code. That adds a minimum
overhead due to branching. But the overall performance seems unchanged
(tested on linux in AMD and NVidia).

Reviewers: pascal, brecht, fclem

Differential Revision: https://developer.blender.org/D2822

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

M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c

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

diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index b205c90cc79..b060031c27f 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -2861,6 +2861,14 @@ void node_bsdf_principled_clearcoat(vec4 base_color, float subsurface, vec3 subs
 	float clearcoat_roughness, float ior, float transmission, float transmission_roughness, vec3 N, vec3 CN, vec3 T, vec3 I, float ssr_id, out Closure result)
 {
 #ifdef EEVEE_ENGINE
+	if (clearcoat == 0.0) {
+		node_bsdf_principled_simple(
+			base_color, subsurface, subsurface_radius, subsurface_color, metallic, specular,
+			specular_tint, roughness, anisotropic, anisotropic_rotation, sheen, sheen_tint, clearcoat,
+			clearcoat_roughness, ior, transmission, transmission_roughness, N, CN, T, I, ssr_id, result);
+		return;
+	}
+
 	vec3 diffuse, f0, ssr_spec;
 	convert_metallic_to_specular_tinted(base_color.rgb, metallic, specular, specular_tint, diffuse, f0);
 
diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
index 1ec77bc9189..29a6d062947 100644
--- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
+++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c
@@ -98,13 +98,7 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, bNode *node, bNodeE
 		        &in[19].link);
 	}
 
-	/* Only use complex versions when needed. */
-	if (!in[12].link && (in[12].vec[0] == 0.0f)) {
-		return GPU_stack_link(mat, node, "node_bsdf_principled_simple", in, out, GPU_builtin(GPU_VIEW_POSITION), GPU_uniform(&node->ssr_id));
-	}
-	else {
-		return GPU_stack_link(mat, node, "node_bsdf_principled_clearcoat", in, out, GPU_builtin(GPU_VIEW_POSITION), GPU_uniform(&node->ssr_id));
-	}
+	return GPU_stack_link(mat, node, "node_bsdf_principled_clearcoat", in, out, GPU_builtin(GPU_VIEW_POSITION), GPU_uniform(&node->ssr_id));
 }
 
 static void node_shader_update_principled(bNodeTree *UNUSED(ntree), bNode *node)



More information about the Bf-blender-cvs mailing list