diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-05-27 21:48:02 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2013-05-27 21:48:02 +0400 |
commit | 601b8c1041a6eece565e575d127a6056bc45cbbb (patch) | |
tree | 1f29d388e4bff9c06431e91ad6d4ad7032f66605 | |
parent | 833ca58260ec024abde2d43ba39184f74e66e86b (diff) |
Fix #35505: cycles object space normal mapping did not match blender internal.
Now it uses the same (strange) YZ flipping convention.
-rw-r--r-- | intern/cycles/kernel/shaders/node_normal_map.osl | 14 | ||||
-rw-r--r-- | intern/cycles/kernel/svm/svm_tex_coord.h | 8 | ||||
-rw-r--r-- | source/blender/gpu/shaders/gpu_shader_material.glsl | 5 |
3 files changed, 23 insertions, 4 deletions
diff --git a/intern/cycles/kernel/shaders/node_normal_map.osl b/intern/cycles/kernel/shaders/node_normal_map.osl index c3d6e7bd391..9018cca1390 100644 --- a/intern/cycles/kernel/shaders/node_normal_map.osl +++ b/intern/cycles/kernel/shaders/node_normal_map.osl @@ -55,10 +55,20 @@ shader node_normal_map( Normal = normal(0, 0, 0); } } - else if (space == "Object") + else if (space == "Object") { + /* strange blender convention */ + mcolor[1] = -mcolor[1]; + mcolor[2] = -mcolor[2]; + Normal = normalize(transform("object", "world", vector(mcolor))); - else if (space == "World") + } + else if (space == "World") { + /* strange blender convention */ + mcolor[1] = -mcolor[1]; + mcolor[2] = -mcolor[2]; + Normal = normalize(vector(mcolor)); + } 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 c4cf0d95793..686b332a322 100644 --- a/intern/cycles/kernel/svm/svm_tex_coord.h +++ b/intern/cycles/kernel/svm/svm_tex_coord.h @@ -276,13 +276,17 @@ __device void svm_node_normal_map(KernelGlobals *kg, ShaderData *sd, float *stac object_normal_transform(kg, sd, &N); } else { + /* strange blender convention */ + color.y = -color.y; + color.z = -color.z; + /* object, world space */ N = color; if(space == NODE_NORMAL_MAP_OBJECT) object_normal_transform(kg, sd, &N); - - N = normalize(N); + else + N = normalize(N); } float strength = stack_load_float(stack, strength_offset); diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index fe54cd16b73..38a8d92a56a 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -2273,6 +2273,11 @@ void node_object_info(out vec3 location, out float object_index, out float mater random = 0.0; } +void node_normal_map(float strength, vec4 color, vec3 N, out vec3 result) +{ + result = N; +} + void node_bump(float strength, float dist, float height, vec3 N, out vec3 result) { result = N; |