diff options
Diffstat (limited to 'intern/cycles/kernel/shaders/node_normal_map.osl')
-rw-r--r-- | intern/cycles/kernel/shaders/node_normal_map.osl | 20 |
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))); |