Commit: 50376529ee1141f1aa2d354278ad315e0a174257
Author: Ralf Hölzemer
Date:   Mon May 23 16:12:52 2016 +0300
Branches: compositor-2016
https://developer.blender.org/rB50376529ee1141f1aa2d354278ad315e0a174257

Enable correct GLSL output for cycles normalmap node

See T48453 for details and test scenes

Reviewers: a.romanov, sergey

Reviewed By: a.romanov, sergey

Projects: #opengl_gfx, #nodes

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

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

M       source/blender/gpu/shaders/gpu_shader_material.glsl
M       source/blender/nodes/shader/nodes/node_shader_normal_map.c

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

diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl 
b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 9ac9bf0..a63e7b8 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -142,6 +142,20 @@ void color_to_normal(vec3 color, out vec3 normal)
        normal.z =  2.0 * ((color.b) - 0.5);
 }
 
+void color_to_normal_new_shading(vec3 color, out vec3 normal)
+{
+       normal.x =  2.0 * ((color.r) - 0.5);
+       normal.y =  2.0 * ((color.g) - 0.5);
+       normal.z =  2.0 * ((color.b) - 0.5);
+}
+
+void color_to_blender_normal_new_shading(vec3 color, out vec3 normal)
+{
+       normal.x =  2.0 * ((color.r) - 0.5);
+       normal.y = -2.0 * ((color.g) - 0.5);
+       normal.z = -2.0 * ((color.b) - 0.5);
+}
+
 #define M_PI 3.14159265358979323846
 #define M_1_PI 0.31830988618379069
 
diff --git a/source/blender/nodes/shader/nodes/node_shader_normal_map.c 
b/source/blender/nodes/shader/nodes/node_shader_normal_map.c
index 642e5b2..d269560 100644
--- a/source/blender/nodes/shader/nodes/node_shader_normal_map.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal_map.c
@@ -121,35 +121,69 @@ static int gpu_shader_normal_map(GPUMaterial *mat, bNode 
*node, bNodeExecData *U
        else
                strength = GPU_uniform(in[0].vec);
 
-       if (in[1].link) {
-               GPU_link(mat, "color_to_normal", in[1].link, &realnorm);
-               GPU_link(mat, "mtex_negate_texnormal", realnorm,  &realnorm);
-       }
+       if (in[1].link)
+               realnorm = in[1].link;
+       else
+               realnorm = GPU_uniform(in[1].vec);
 
+       negnorm = GPU_builtin(GPU_VIEW_NORMAL);
        GPU_link(mat, "math_max", strength, GPU_uniform(d), &strength);
-       GPU_link(mat, "vec_math_negate", GPU_builtin(GPU_VIEW_NORMAL), 
&negnorm);
 
-       if (in[1].link) {
+       if (GPU_material_use_new_shading_nodes(mat)) {
+
+               /* **************** CYCLES ******************** */
+
+               GPU_link(mat, "direction_transform_m4v3", negnorm, 
GPU_builtin(GPU_INVERSE_VIEW_MATRIX), &negnorm);
+
                switch (nm->space) {
                        case SHD_NORMAL_MAP_TANGENT:
-                               GPU_link(mat, "node_normal_map", 
GPU_attribute(CD_TANGENT, nm->uv_map), negnorm, realnorm, &out[0].link);
+                               GPU_link(mat, "color_to_normal_new_shading", 
realnorm, &realnorm);
+                               GPU_link(mat, "node_normal_map", 
GPU_attribute(CD_TANGENT, nm->uv_map), negnorm, realnorm, &realnorm);
                                break;
                        case SHD_NORMAL_MAP_OBJECT:
+                               GPU_link(mat, "color_to_normal_new_shading", 
realnorm, &realnorm);
+                               GPU_link(mat, "direction_transform_m4v3", 
realnorm, GPU_builtin(GPU_OBJECT_MATRIX),  &realnorm);
+                               break;
                        case SHD_NORMAL_MAP_BLENDER_OBJECT:
-                               GPU_link(mat, "direction_transform_m4v3", 
realnorm, GPU_builtin(GPU_LOC_TO_VIEW_MATRIX),  &out[0].link);
+                               GPU_link(mat, 
"color_to_blender_normal_new_shading", realnorm, &realnorm);
+                               GPU_link(mat, "direction_transform_m4v3", 
realnorm, GPU_builtin(GPU_OBJECT_MATRIX),  &realnorm);
                                break;
                        case SHD_NORMAL_MAP_WORLD:
+                               GPU_link(mat, "color_to_normal_new_shading", 
realnorm, &realnorm);
+                               break;
                        case SHD_NORMAL_MAP_BLENDER_WORLD:
-                               GPU_link(mat, "direction_transform_m4v3", 
realnorm, GPU_builtin(GPU_VIEW_MATRIX),  &out[0].link);
+                               GPU_link(mat, 
"color_to_blender_normal_new_shading", realnorm, &realnorm);
                                break;
+
+               GPU_link(mat, "vect_normalize", realnorm, &realnorm);
                }
-       }
 
-       if (out[0].link) {
-               GPU_link(mat, "vec_math_mix", strength, out[0].link, negnorm,  
&out[0].link);
-               GPU_link(mat, "vect_normalize", out[0].link, &out[0].link);
+       } else {
+
+               /* *********** BLENDER INTERNAL *************** */
+
+               GPU_link(mat, "color_to_normal", realnorm, &realnorm);
+               GPU_link(mat, "mtex_negate_texnormal", realnorm,  &realnorm);
+               GPU_link(mat, "vec_math_negate", negnorm, &negnorm);
+
+               switch (nm->space) {
+                       case SHD_NORMAL_MAP_TANGENT:
+                               GPU_link(mat, "node_normal_map", 
GPU_attribute(CD_TANGENT, nm->uv_map), negnorm, realnorm, &realnorm);
+                               break;
+                       case SHD_NORMAL_MAP_OBJECT:
+                       case SHD_NORMAL_MAP_BLENDER_OBJECT:
+                               GPU_link(mat, "direction_transform_m4v3", 
realnorm, GPU_builtin(GPU_LOC_TO_VIEW_MATRIX),  &realnorm);
+                               break;
+                       case SHD_NORMAL_MAP_WORLD:
+                       case SHD_NORMAL_MAP_BLENDER_WORLD:
+                               GPU_link(mat, "direction_transform_m4v3", 
realnorm, GPU_builtin(GPU_VIEW_MATRIX),  &realnorm);
+                               break;
+               }
        }
 
+       GPU_link(mat, "vec_math_mix", strength, realnorm, negnorm,  
&out[0].link);
+       GPU_link(mat, "vect_normalize", out[0].link, &out[0].link);
+
        return true;
 }
 
@@ -169,4 +203,3 @@ void register_node_type_sh_normal_map(void)
 
        nodeRegisterType(&ntype);
 }
-

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to