[Bf-blender-cvs] [5c234a558c1] master: Fix T72269: crash with Eevee and normal maps after recent math node changes

Brecht Van Lommel noreply at git.blender.org
Sun Dec 8 16:44:25 CET 2019


Commit: 5c234a558c1ac0921f171fa38c59bb51b21e2b74
Author: Brecht Van Lommel
Date:   Sun Dec 8 16:34:41 2019 +0100
Branches: master
https://developer.blender.org/rB5c234a558c1ac0921f171fa38c59bb51b21e2b74

Fix T72269: crash with Eevee and normal maps after recent math node changes

Reusing math node functions for normal map node caused problems.

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

M	source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
M	source/blender/gpu/shaders/material/gpu_shader_material_normal_map.glsl
M	source/blender/nodes/shader/nodes/node_shader_normal_map.c

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

diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
index d4f7866b206..e8487fb5d42 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_math_util.glsl
@@ -93,11 +93,6 @@ vec3 c_mod(vec3 a, vec3 b)
   return vec3(c_mod(a.x, b.x), c_mod(a.y, b.y), c_mod(a.z, b.z));
 }
 
-void vector_mix(float strength, vec3 a, vec3 b, out vec3 outVector)
-{
-  outVector = strength * a + (1 - strength) * b;
-}
-
 void invert_z(vec3 v, out vec3 outv)
 {
   v.z = -v.z;
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_normal_map.glsl b/source/blender/gpu/shaders/material/gpu_shader_material_normal_map.glsl
index a9be6bfa0ff..2b4a0204d97 100644
--- a/source/blender/gpu/shaders/material/gpu_shader_material_normal_map.glsl
+++ b/source/blender/gpu/shaders/material/gpu_shader_material_normal_map.glsl
@@ -20,3 +20,8 @@ void color_to_blender_normal_new_shading(vec3 color, out vec3 normal)
 {
   normal = vec3(2.0, -2.0, -2.0) * color - vec3(1.0);
 }
+
+void node_normal_map_mix(float strength, vec3 newnormal, vec3 oldnormal, out vec3 outnormal)
+{
+  outnormal = normalize(mix(oldnormal, newnormal, max(strength, 0.0)));
+}
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 18015d94f03..006f15f40a1 100644
--- a/source/blender/nodes/shader/nodes/node_shader_normal_map.c
+++ b/source/blender/nodes/shader/nodes/node_shader_normal_map.c
@@ -54,12 +54,8 @@ static int gpu_shader_normal_map(GPUMaterial *mat,
                                  GPUNodeStack *out)
 {
   NodeShaderNormalMap *nm = node->storage;
-  GPUNodeLink *negnorm;
-  GPUNodeLink *realnorm;
-  GPUNodeLink *strength;
-
-  float strength_min[4] = {0, 0, 0, 0};
 
+  GPUNodeLink *strength;
   if (in[0].link) {
     strength = in[0].link;
   }
@@ -72,27 +68,25 @@ static int gpu_shader_normal_map(GPUMaterial *mat,
     strength = GPU_constant(in[0].vec);
   }
 
+  GPUNodeLink *newnormal;
   if (in[1].link) {
-    realnorm = in[1].link;
+    newnormal = in[1].link;
   }
   else if (node->original) {
     bNodeSocket *socket = BLI_findlink(&node->original->inputs, 1);
     bNodeSocketValueRGBA *socket_data = socket->default_value;
-    realnorm = GPU_uniform(socket_data->value);
+    newnormal = GPU_uniform(socket_data->value);
   }
   else {
-    realnorm = GPU_constant(in[1].vec);
+    newnormal = GPU_constant(in[1].vec);
   }
 
-  negnorm = GPU_builtin(GPU_WORLD_NORMAL);
-  GPU_link(mat, "math_maximum", strength, GPU_constant(strength_min), &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);
+  GPU_link(mat, color_to_normal_fnc_name, newnormal, &newnormal);
   switch (nm->space) {
     case SHD_SPACE_TANGENT:
       GPU_link(mat,
@@ -100,13 +94,13 @@ static int gpu_shader_normal_map(GPUMaterial *mat,
                GPU_builtin(GPU_OBJECT_INFO),
                GPU_attribute(CD_TANGENT, nm->uv_map),
                GPU_builtin(GPU_WORLD_NORMAL),
-               realnorm,
-               &realnorm);
+               newnormal,
+               &newnormal);
       break;
     case SHD_SPACE_OBJECT:
     case SHD_SPACE_BLENDER_OBJECT:
       GPU_link(
-          mat, "direction_transform_m4v3", realnorm, GPU_builtin(GPU_OBJECT_MATRIX), &realnorm);
+          mat, "direction_transform_m4v3", newnormal, GPU_builtin(GPU_OBJECT_MATRIX), &newnormal);
       break;
     case SHD_SPACE_WORLD:
     case SHD_SPACE_BLENDER_WORLD:
@@ -114,8 +108,8 @@ static int gpu_shader_normal_map(GPUMaterial *mat,
       break;
   }
 
-  GPU_link(mat, "vector_mix", strength, realnorm, negnorm, &out[0].link);
-  GPU_link(mat, "vector_normalize", out[0].link, &out[0].link);
+  GPUNodeLink *oldnormal = GPU_builtin(GPU_WORLD_NORMAL);
+  GPU_link(mat, "node_normal_map_mix", strength, newnormal, oldnormal, &out[0].link);
 
   return true;
 }



More information about the Bf-blender-cvs mailing list