[Bf-blender-cvs] [ba256b32ee5] blender2.8 master: Fix T52001: material draw mode principled BSDF artifacts at some angles.

Brecht Van Lommel noreply at git.blender.org
Sun Jul 9 00:02:17 CEST 2017


Commit: ba256b32ee5d3ab7991fe5abbb47071ccfe8577c
Author: Brecht Van Lommel
Date:   Sat Jul 8 23:37:16 2017 +0200
Branches: blender2.8 master
https://developer.blender.org/rBba256b32ee5d3ab7991fe5abbb47071ccfe8577c

Fix T52001: material draw mode principled BSDF artifacts at some angles.

The default anisotropic tangent computation could fail in some cases,
leading to NaNs and artifacts. Use a simpler formulation that doesn't
suffer from this.

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

M	source/blender/gpu/shaders/gpu_shader_material.glsl

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

diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 67a099159c5..f14db57a26a 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -2636,14 +2636,11 @@ void node_bsdf_principled(vec4 base_color, float subsurface, vec3 subsurface_rad
 	vec3 Tangent = T;
 	if (T == vec3(0.0)) {
 		// if no tangent is set, use a default tangent
-		Tangent = vec3(1.0, 0.0, 0.0);
-		if (N.x != 0.0 || N.y != 0.0) {
-			vec3 N_xz = normalize(vec3(N.x, 0.0, N.z));
-
-			vec3 axis = normalize(cross(vec3(0.0, 0.0, 1.0), N_xz));
-			float angle = acos(dot(vec3(0.0, 0.0, 1.0), N_xz));
-
-			Tangent = normalize(rotate_vector(vec3(1.0, 0.0, 0.0), axis, angle));
+		if(N.x != N.y || N.x != N.z) {
+			Tangent = vec3(N.z-N.y, N.x-N.z, N.y-N.x);  // (1,1,1) x N
+		}
+		else {
+			Tangent = vec3(N.z-N.y, N.x+N.z, -N.y-N.x);  // (-1,1,1) x N
 		}
 	}




More information about the Bf-blender-cvs mailing list