Eevee: Fix black mesh when tangent is not present
authorClément Foucault <foucault.clem@gmail.com>
Wed, 13 Mar 2019 22:13:58 +0000 (23:13 +0100)
committerClément Foucault <foucault.clem@gmail.com>
Wed, 13 Mar 2019 22:15:11 +0000 (23:15 +0100)
In this case, the generic vertex attribute is {0,0,0,1}. So we look for
this case.

This fixes black text objects with a normal map applied. Also this could
help porting sculpt mode drawing to Eevee without supporting normal
mapping.

Note that will just fix black meshes due to T61870 but objects will not
show their normal map. So it's not a fix for this issue.

source/blender/gpu/intern/gpu_codegen.c
source/blender/gpu/shaders/gpu_shader_material.glsl

index f3386ec3a653e602d4fb8cce0fdbaf26896dd7bb..513dfad9d8a05285faadf6b52640f60a6a9c8de9 100644 (file)
@@ -1001,7 +1001,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 = normalize(NormalMatrix * att%d.xyz);\n",
+                                               ds, "\tvar%d%s.xyz = NormalMatrix * att%d.xyz;\n",
                                                input->attr_id, use_geom ? "g" : "", input->attr_id);
                                        BLI_dynstr_appendf(
                                                ds, "\tvar%d%s.w = att%d.w;\n",
index d91b6b77b860c717f6d933a69b5357ce1586a459..5625cbb69c7bff4e22de8b242972261c69d2a994 100644 (file)
@@ -2967,6 +2967,12 @@ void node_object_info(mat4 obmat, vec3 info, out vec3 location, out float object
 
 void node_normal_map(vec4 tangent, vec3 normal, vec3 texnormal, out vec3 outnormal)
 {
+       if (all(equal(tangent, vec4(0.0, 0.0, 0.0, 1.0)))) {
+               outnormal = normal;
+               return;
+       }
+
+       tangent.xyz = normalize(tangent.xyz);
        vec3 B = tangent.w * cross(normal, tangent.xyz);
 
        outnormal = texnormal.x * tangent.xyz + texnormal.y * B + texnormal.z * normal;