[Bf-blender-cvs] [c376878] master: Fix T49187: inconsistent Normal Map node output for backfacing polygons.

Alexander Gavrilov noreply at git.blender.org
Tue Aug 30 11:52:06 CEST 2016


Commit: c376878e5421f4b53ef812f77ab9127effea4505
Author: Alexander Gavrilov
Date:   Tue Aug 30 12:48:59 2016 +0300
Branches: master
https://developer.blender.org/rBc376878e5421f4b53ef812f77ab9127effea4505

Fix T49187: inconsistent Normal Map node output for backfacing polygons.

There basically are two issues here: in smooth mode (and all non-tangent
normal map types) it doesn't invert the normal for backfacing polys;
on the other hand for flat shaded tangent type it is inverted too soon.

This fix does a brute force correction by checking the backfacing flag.

Reviewers: #cycles, brecht

Reviewed By: #cycles, brecht

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

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

M	intern/cycles/kernel/shaders/node_normal_map.osl
M	intern/cycles/kernel/svm/svm_tex_coord.h

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

diff --git a/intern/cycles/kernel/shaders/node_normal_map.osl b/intern/cycles/kernel/shaders/node_normal_map.osl
index f95e9fc..41bcac4 100644
--- a/intern/cycles/kernel/shaders/node_normal_map.osl
+++ b/intern/cycles/kernel/shaders/node_normal_map.osl
@@ -26,6 +26,7 @@ shader node_normal_map(
 	output normal Normal = NormalIn)
 {
 	color mcolor = 2.0 * color(Color[0] - 0.5, Color[1] - 0.5, Color[2] - 0.5);
+	int is_backfacing = backfacing();
 
 	if (space == "tangent") {
 		vector tangent;
@@ -34,9 +35,15 @@ shader node_normal_map(
 		float is_smooth;
 
 		getattribute("geom:is_smooth", is_smooth);
-		if (!is_smooth)
+		if (!is_smooth) {
 			ninterp = normalize(transform("world", "object", Ng));
 
+			/* the normal is already inverted, which is too soon for the math here */
+			if (is_backfacing) {
+				ninterp = -ninterp;
+			}
+		}
+
 		// get _unnormalized_ interpolated normal and tangent
 		if (getattribute(attr_name, tangent) &&
 		    getattribute(attr_sign_name, tangent_sign) &&
@@ -73,7 +80,12 @@ shader node_normal_map(
 	
 		Normal = normalize(vector(mcolor));
 	}
-	
+
+	/* invert normal for backfacing polygons */
+	if (is_backfacing) {
+		Normal = -Normal;
+	}
+
 	if (Strength != 1.0)
 		Normal = normalize(NormalIn + (Normal - NormalIn) * max(Strength, 0.0));
 }
diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h
index 01dede3..6ea2539 100644
--- a/intern/cycles/kernel/svm/svm_tex_coord.h
+++ b/intern/cycles/kernel/svm/svm_tex_coord.h
@@ -277,6 +277,7 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st
 	float3 color = stack_load_float3(stack, color_offset);
 	color = 2.0f*make_float3(color.x - 0.5f, color.y - 0.5f, color.z - 0.5f);
 
+	bool is_backfacing = (ccl_fetch(sd, flag) & SD_BACKFACING) != 0;
 	float3 N;
 
 	if(space == NODE_NORMAL_MAP_TANGENT) {
@@ -306,6 +307,12 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st
 		}
 		else {
 			normal = ccl_fetch(sd, Ng);
+
+			/* the normal is already inverted, which is too soon for the math here */
+			if(is_backfacing) {
+				normal = -normal;
+			}
+
 			object_inverse_normal_transform(kg, sd, &normal);
 		}
 
@@ -332,6 +339,11 @@ ccl_device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *st
 			N = safe_normalize(N);
 	}
 
+	/* invert normal for backfacing polygons */
+	if(is_backfacing) {
+		N = -N;
+	}
+
 	float strength = stack_load_float(stack, strength_offset);
 
 	if(strength != 1.0f) {




More information about the Bf-blender-cvs mailing list