From a6b218af2e62f5f0b37c05458072c7a4fb8ebf3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ralf=20H=C3=B6lzemer?= Date: Mon, 23 May 2016 16:12:52 +0300 Subject: 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 --- .../blender/gpu/shaders/gpu_shader_material.glsl | 14 +++++ .../nodes/shader/nodes/node_shader_normal_map.c | 61 +++++++++++++++++----- 2 files changed, 61 insertions(+), 14 deletions(-) (limited to 'source') diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index 9ac9bf020ed..a63e7b8dbf0 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 642e5b296be..d2695609a88 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); } - -- cgit v1.2.3