From 7ec7888ff384adccfaca2777c021b40dd726fa8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 8 May 2019 23:21:09 +0200 Subject: [PATCH] Eevee: Fix Tangent vectors using NormalMatrix and make them world space Making them world space by default remove a lot of legacy conversion from viewspace. --- source/blender/gpu/intern/gpu_codegen.c | 2 +- .../gpu/shaders/gpu_shader_material.glsl | 14 +++------ .../nodes/node_shader_bsdf_principled.c | 3 +- .../shader/nodes/node_shader_normal_map.c | 31 ++++--------------- .../nodes/shader/nodes/node_shader_tangent.c | 13 ++------ .../nodes/node_shader_vector_displacement.c | 2 +- 6 files changed, 17 insertions(+), 48 deletions(-) diff --git a/source/blender/gpu/intern/gpu_codegen.c b/source/blender/gpu/intern/gpu_codegen.c index 310c57fdbee..2c42cc654e2 100644 --- a/source/blender/gpu/intern/gpu_codegen.c +++ b/source/blender/gpu/intern/gpu_codegen.c @@ -1118,7 +1118,7 @@ static char *code_generate_vertex(ListBase *nodes, const char *vert_code, bool u if (input->source == GPU_SOURCE_ATTR && input->attr_first) { if (input->attr_type == CD_TANGENT) { /* silly exception */ BLI_dynstr_appendf(ds, - "\tvar%d%s.xyz = NormalMatrix * att%d.xyz;\n", + "\tvar%d%s.xyz = transpose(mat3(ModelMatrixInverse)) * att%d.xyz;\n", input->attr_id, use_geom ? "g" : "", input->attr_id); diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl index f03e30b55f7..59eb463635e 100644 --- a/source/blender/gpu/shaders/gpu_shader_material.glsl +++ b/source/blender/gpu/shaders/gpu_shader_material.glsl @@ -2013,18 +2013,13 @@ void tangent_orco_z(vec3 orco_in, out vec3 orco_out) orco_out = orco_in.yxz * vec3(-0.5, 0.5, 0.0) + vec3(0.25, -0.25, 0.0); } -void node_tangentmap(vec4 attr_tangent, mat4 toworld, out vec3 tangent) +void node_tangentmap(vec4 attr_tangent, out vec3 tangent) { - tangent = normalize((toworld * vec4(attr_tangent.xyz, 0.0)).xyz); + tangent = normalize(attr_tangent.xyz); } -void node_tangent(vec3 N, vec3 orco, mat4 objmat, mat4 toworld, out vec3 T) +void node_tangent(vec3 N, vec3 orco, mat4 objmat, out vec3 T) { -#ifndef VOLUMETRICS - N = normalize(gl_FrontFacing ? worldNormal : -worldNormal); -#else - N = (toworld * vec4(N, 0.0)).xyz; -#endif T = (objmat * vec4(orco, 0.0)).xyz; T = cross(N, normalize(cross(T, N))); } @@ -2068,7 +2063,7 @@ void node_geometry(vec3 I, true_normal = normal; # endif tangent_orco_z(orco, orco); - node_tangent(N, orco, objmat, toworld, tangent); + node_tangent(N, orco, objmat, tangent); parametric = vec3(barycentric, 0.0); backfacing = (gl_FrontFacing) ? 0.0 : 1.0; @@ -3334,6 +3329,7 @@ void node_vector_displacement_tangent(vec4 vector, mat4 viewmat, out vec3 result) { + /* TODO(fclem) this is broken. revisit latter. */ vec3 N_object = normalize(((vec4(normal, 0.0) * viewmat) * obmat).xyz); vec3 T_object = normalize(((vec4(tangent.xyz, 0.0) * viewmat) * obmat).xyz); vec3 B_object = tangent.w * normalize(cross(N_object, T_object)); diff --git a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c index 37c35c0adc8..72852d28744 100644 --- a/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c +++ b/source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c @@ -114,10 +114,9 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat, GPU_link(mat, "tangent_orco_z", orco, &in[19].link); GPU_link(mat, "node_tangent", - GPU_builtin(GPU_VIEW_NORMAL), + GPU_builtin(GPU_WORLD_NORMAL), in[19].link, GPU_builtin(GPU_OBJECT_MATRIX), - GPU_builtin(GPU_INVERSE_VIEW_MATRIX), &in[19].link); } 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 d769a219fa0..4976d038065 100644 --- a/source/blender/nodes/shader/nodes/node_shader_normal_map.c +++ b/source/blender/nodes/shader/nodes/node_shader_normal_map.c @@ -84,52 +84,33 @@ static int gpu_shader_normal_map(GPUMaterial *mat, realnorm = GPU_constant(in[1].vec); } - negnorm = GPU_builtin(GPU_VIEW_NORMAL); + negnorm = GPU_builtin(GPU_WORLD_NORMAL); GPU_link(mat, "math_max", strength, GPU_constant(d), &strength); const char *color_to_normal_fnc_name = "color_to_normal_new_shading"; if (nm->space == SHD_SPACE_BLENDER_OBJECT || nm->space == SHD_SPACE_BLENDER_WORLD) { color_to_normal_fnc_name = "color_to_blender_normal_new_shading"; } + + GPU_link(mat, color_to_normal_fnc_name, realnorm, &realnorm); switch (nm->space) { case SHD_SPACE_TANGENT: - GPU_link(mat, "color_to_normal_new_shading", realnorm, &realnorm); GPU_link(mat, "node_normal_map", GPU_builtin(GPU_OBJECT_INFO), GPU_attribute(CD_TANGENT, nm->uv_map), - negnorm, + GPU_builtin(GPU_WORLD_NORMAL), realnorm, &realnorm); - GPU_link( - mat, "vec_math_mix", strength, realnorm, GPU_builtin(GPU_VIEW_NORMAL), &out[0].link); - /* for uniform scale this is sufficient to match Cycles */ - GPU_link(mat, - "direction_transform_m4v3", - out[0].link, - GPU_builtin(GPU_INVERSE_VIEW_MATRIX), - &out[0].link); - GPU_link(mat, "vect_normalize", out[0].link, &out[0].link); - return true; + break; case SHD_SPACE_OBJECT: case SHD_SPACE_BLENDER_OBJECT: - GPU_link(mat, - "direction_transform_m4v3", - negnorm, - GPU_builtin(GPU_INVERSE_VIEW_MATRIX), - &negnorm); - GPU_link(mat, color_to_normal_fnc_name, realnorm, &realnorm); GPU_link( mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_OBJECT_MATRIX), &realnorm); break; case SHD_SPACE_WORLD: case SHD_SPACE_BLENDER_WORLD: - GPU_link(mat, - "direction_transform_m4v3", - negnorm, - GPU_builtin(GPU_INVERSE_VIEW_MATRIX), - &negnorm); - GPU_link(mat, color_to_normal_fnc_name, realnorm, &realnorm); + /* Nothing to do. */ break; } diff --git a/source/blender/nodes/shader/nodes/node_shader_tangent.c b/source/blender/nodes/shader/nodes/node_shader_tangent.c index 5512754d9a2..6795f48edb3 100644 --- a/source/blender/nodes/shader/nodes/node_shader_tangent.c +++ b/source/blender/nodes/shader/nodes/node_shader_tangent.c @@ -42,13 +42,7 @@ static int node_shader_gpu_tangent(GPUMaterial *mat, NodeShaderTangent *attr = node->storage; if (attr->direction_type == SHD_TANGENT_UVMAP) { - return GPU_stack_link(mat, - node, - "node_tangentmap", - in, - out, - GPU_attribute(CD_TANGENT, ""), - GPU_builtin(GPU_INVERSE_VIEW_MATRIX)); + return GPU_stack_link(mat, node, "node_tangentmap", in, out, GPU_attribute(CD_TANGENT, "")); } else { GPUNodeLink *orco = GPU_attribute(CD_ORCO, ""); @@ -68,10 +62,9 @@ static int node_shader_gpu_tangent(GPUMaterial *mat, "node_tangent", in, out, - GPU_builtin(GPU_VIEW_NORMAL), + GPU_builtin(GPU_WORLD_NORMAL), orco, - GPU_builtin(GPU_OBJECT_MATRIX), - GPU_builtin(GPU_INVERSE_VIEW_MATRIX)); + GPU_builtin(GPU_OBJECT_MATRIX)); } } diff --git a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.c b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.c index cbc012040b0..ac8b49c4572 100644 --- a/source/blender/nodes/shader/nodes/node_shader_vector_displacement.c +++ b/source/blender/nodes/shader/nodes/node_shader_vector_displacement.c @@ -61,7 +61,7 @@ static int gpu_shader_vector_displacement(GPUMaterial *mat, in, out, GPU_attribute(CD_TANGENT, ""), - GPU_builtin(GPU_VIEW_NORMAL), + GPU_builtin(GPU_WORLD_NORMAL), GPU_builtin(GPU_OBJECT_MATRIX), GPU_builtin(GPU_VIEW_MATRIX)); }