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
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -121,34 +121,68 @@ 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, "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, "color_to_blender_normal_new_shading", realnorm, &realnorm);
|
||||
break;
|
||||
|
||||
GPU_link(mat, "vect_normalize", realnorm, &realnorm);
|
||||
}
|
||||
|
||||
} 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), &out[0].link);
|
||||
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), &out[0].link);
|
||||
GPU_link(mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_VIEW_MATRIX), &realnorm);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user