Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/shaders/node_normal_map.osl')
-rw-r--r--intern/cycles/kernel/shaders/node_normal_map.osl20
1 files changed, 14 insertions, 6 deletions
diff --git a/intern/cycles/kernel/shaders/node_normal_map.osl b/intern/cycles/kernel/shaders/node_normal_map.osl
index dc25eb8539f..21382fab06f 100644
--- a/intern/cycles/kernel/shaders/node_normal_map.osl
+++ b/intern/cycles/kernel/shaders/node_normal_map.osl
@@ -31,15 +31,23 @@ shader node_normal_map(
if (space == "Tangent") {
vector tangent;
+ vector ninterp;
float tangent_sign;
- getattribute(attr_name, tangent);
- getattribute(attr_sign_name, tangent_sign);
+ // get _unnormalized_ interpolated normal and tangent
+ if(!getattribute(attr_name, tangent) ||
+ !getattribute(attr_sign_name, tangent_sign) ||
+ !getattribute("geom:N", ninterp)) {
+ Normal = normal(0, 0, 0);
+ }
+ else {
+ // apply normal map
+ vector B = tangent_sign * cross(ninterp, tangent);
+ Normal = normalize(mcolor[0] * tangent + mcolor[1] * B + mcolor[2] * ninterp);
- tangent = transform("object", "world", tangent);
-
- vector B = tangent_sign * cross(NormalIn, tangent);
- Normal = normalize(mcolor[0] * tangent + mcolor[1] * B + mcolor[2] * NormalIn);
+ // transform to world space
+ Normal = normalize(transform("object", "world", Normal));
+ }
}
else if (space == "Object")
Normal = normalize(transform("object", "world", vector(mcolor)));