Eevee: Fix SSS energy disapearing with alpha blended material
authorClément Foucault <foucault.clem@gmail.com>
Thu, 23 May 2019 13:30:38 +0000 (15:30 +0200)
committerClément Foucault <foucault.clem@gmail.com>
Thu, 23 May 2019 13:32:05 +0000 (15:32 +0200)
source/blender/gpu/intern/gpu_material.c
source/blender/nodes/shader/nodes/node_shader_bsdf_principled.c

index fde60fd387d804a875dda8136e80011b1f0a2fe4..007a13a06efc260a46bd05835bd4e7739b080e38 100644 (file)
@@ -620,7 +620,7 @@ void GPU_material_flag_set(GPUMaterial *mat, eGPUMatFlag flag)
 
 bool GPU_material_flag_get(GPUMaterial *mat, eGPUMatFlag flag)
 {
-  return (mat->flag & flag);
+  return (mat->flag & flag) != 0;
 }
 
 GPUMaterial *GPU_material_from_nodetree_find(ListBase *gpumaterials,
@@ -684,7 +684,10 @@ GPUMaterial *GPU_material_from_nodetree(Scene *scene,
   if (mat->outlink) {
     /* HACK: this is only for eevee. We add the define here after the nodetree evaluation. */
     if (GPU_material_flag_get(mat, GPU_MATFLAG_SSS)) {
-      defines = BLI_string_joinN(defines, "#define USE_SSS\n");
+      defines = BLI_string_joinN(defines,
+                                 "#ifndef USE_ALPHA_BLEND\n"
+                                 "#  define USE_SSS\n"
+                                 "#endif\n");
     }
     /* Prune the unused nodes and extract attributes before compiling so the
      * generated VBOs are ready to accept the future shader. */
index 6c3e082f36af1e69039958b052f7e4c6a4d34750..48065cb10c9801d7ccdb7bb6fbb71f46caf826db 100644 (file)
@@ -164,7 +164,7 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat,
   else if (use_subsurf && use_diffuse && !use_refract && !use_clear) {
     static char name[] = "node_bsdf_principled_subsurface";
     node_name = name;
-    flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_SSS | GPU_MATFLAG_GLOSSY;
+    flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY;
   }
   else if (!use_subsurf && !use_diffuse && use_refract && !use_clear && !socket_not_zero(4)) {
     static char name[] = "node_bsdf_principled_glass";
@@ -174,7 +174,11 @@ static int node_shader_gpu_bsdf_principled(GPUMaterial *mat,
   else {
     static char name[] = "node_bsdf_principled";
     node_name = name;
-    flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY | GPU_MATFLAG_SSS | GPU_MATFLAG_REFRACT;
+    flag = GPU_MATFLAG_DIFFUSE | GPU_MATFLAG_GLOSSY | GPU_MATFLAG_REFRACT;
+  }
+
+  if (use_subsurf) {
+    flag |= GPU_MATFLAG_SSS;
   }
 
   GPU_material_flag_set(mat, flag);