[Bf-blender-cvs] [67c10dbf132] master: Eevee: Add support for the holdout node

Clément Foucault noreply at git.blender.org
Wed Aug 14 13:38:16 CEST 2019


Commit: 67c10dbf1322bd09945c82354d5d3a9004e06bcd
Author: Clément Foucault
Date:   Mon Aug 12 18:40:52 2019 +0200
Branches: master
https://developer.blender.org/rB67c10dbf1322bd09945c82354d5d3a9004e06bcd

Eevee: Add support for the holdout node

Support should be full when using Alpha Blend mode and partial if using
any other blend mode (opaque / alpha clip / alpha hashed).

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

M	release/scripts/startup/nodeitems_builtins.py
M	source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
M	source/blender/gpu/shaders/gpu_shader_material.glsl
M	source/blender/nodes/shader/nodes/node_shader_holdout.c

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

diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index da2359bedd8..a626984cfa7 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -216,7 +216,7 @@ shader_node_categories = [
         NodeItem("ShaderNodeEmission", poll=eevee_cycles_shader_nodes_poll),
         NodeItem("ShaderNodeBsdfHair", poll=object_cycles_shader_nodes_poll),
         NodeItem("ShaderNodeBackground", poll=world_shader_nodes_poll),
-        NodeItem("ShaderNodeHoldout", poll=object_cycles_shader_nodes_poll),
+        NodeItem("ShaderNodeHoldout", poll=object_eevee_cycles_shader_nodes_poll),
         NodeItem("ShaderNodeVolumeAbsorption", poll=eevee_cycles_shader_nodes_poll),
         NodeItem("ShaderNodeVolumeScatter", poll=eevee_cycles_shader_nodes_poll),
         NodeItem("ShaderNodeVolumePrincipled"),
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
index 412fa47dbec..7f795eaac2b 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_common_lib.glsl
@@ -775,6 +775,7 @@ Closure closure_emission(vec3 rgb)
 struct Closure {
   vec3 radiance;
   vec3 transmittance;
+  float holdout;
 #  ifdef USE_SSS
   vec4 sss_data;
 #    ifdef USE_SSS_ALBEDO
@@ -792,16 +793,18 @@ Closure nodetree_exec(void); /* Prototype */
 
 #  define CLOSURE_SSR_FLAG 1
 #  define CLOSURE_SSS_FLAG 2
+#  define CLOSURE_HOLDOUT_FLAG 4
 
 #  ifdef USE_SSS
 #    ifdef USE_SSS_ALBEDO
 #      define CLOSURE_DEFAULT \
-        Closure(vec3(0.0), vec3(0.0), vec4(0.0), vec3(0.0), vec4(0.0), vec2(0.0), 0)
+        Closure(vec3(0.0), vec3(0.0), 0.0, vec4(0.0), vec3(0.0), vec4(0.0), vec2(0.0), 0)
 #    else
-#      define CLOSURE_DEFAULT Closure(vec3(0.0), vec3(0.0), vec4(0.0), vec4(0.0), vec2(0.0), 0)
+#      define CLOSURE_DEFAULT \
+        Closure(vec3(0.0), vec3(0.0), 0.0, vec4(0.0), vec4(0.0), vec2(0.0), 0)
 #    endif
 #  else
-#    define CLOSURE_DEFAULT Closure(vec3(0.0), vec3(0.0), vec4(0.0), vec2(0.0), 0)
+#    define CLOSURE_DEFAULT Closure(vec3(0.0), vec3(0.0), 0.0, vec4(0.0), vec2(0.0), 0)
 #  endif
 
 uniform int outputSsrId = 1;
@@ -848,6 +851,7 @@ void closure_load_sss_data(float radius,
 Closure closure_mix(Closure cl1, Closure cl2, float fac)
 {
   Closure cl;
+  cl.holdout = mix(cl1.holdout, cl2.holdout, fac);
   cl.transmittance = mix(cl1.transmittance, cl2.transmittance, fac);
   cl.radiance = mix(cl1.radiance, cl2.radiance, fac);
   cl.flag = cl1.flag | cl2.flag;
@@ -874,6 +878,7 @@ Closure closure_add(Closure cl1, Closure cl2)
   Closure cl;
   cl.transmittance = cl1.transmittance + cl2.transmittance;
   cl.radiance = cl1.radiance + cl2.radiance;
+  cl.holdout = cl1.holdout + cl2.holdout;
   cl.flag = cl1.flag | cl2.flag;
   cl.ssr_data = cl1.ssr_data + cl2.ssr_data;
   bool use_cl1_ssr = FLAG_TEST(cl1.flag, CLOSURE_SSR_FLAG);
@@ -933,16 +938,18 @@ void main()
 {
   Closure cl = nodetree_exec();
 
+  float holdout = 1.0 - saturate(cl.holdout);
+
 #    ifdef USE_ALPHA_BLEND
   vec2 uvs = gl_FragCoord.xy * volCoordScale.zw;
   vec3 vol_transmit, vol_scatter;
   volumetric_resolve(uvs, gl_FragCoord.z, vol_transmit, vol_scatter);
 
   float transmit = saturate(avg(cl.transmittance));
-  outRadiance = vec4(cl.radiance * vol_transmit + vol_scatter, (1.0 - transmit));
-  outTransmittance = vec4(cl.transmittance, transmit);
+  outRadiance = vec4(cl.radiance * vol_transmit + vol_scatter, (1.0 - transmit) * holdout);
+  outTransmittance = vec4(cl.transmittance, transmit * holdout);
 #    else
-  outRadiance = vec4(cl.radiance, 1.0);
+  outRadiance = vec4(cl.radiance, holdout);
   ssrNormals = cl.ssr_normal;
   ssrData = cl.ssr_data;
 #      ifdef USE_SSS
diff --git a/source/blender/gpu/shaders/gpu_shader_material.glsl b/source/blender/gpu/shaders/gpu_shader_material.glsl
index 798d19b6b9d..7cb38503039 100644
--- a/source/blender/gpu/shaders/gpu_shader_material.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_material.glsl
@@ -1964,6 +1964,15 @@ void node_volume_principled(vec4 color,
 #endif
 }
 
+void node_holdout(out Closure result)
+{
+  result = CLOSURE_DEFAULT;
+#ifndef VOLUMETRICS
+  result.holdout = 1.0;
+  result.flag = CLOSURE_HOLDOUT_FLAG;
+#endif
+}
+
 /* closures */
 
 void node_mix_shader(float fac, Closure shader1, Closure shader2, out Closure shader)
diff --git a/source/blender/nodes/shader/nodes/node_shader_holdout.c b/source/blender/nodes/shader/nodes/node_shader_holdout.c
index a4d1e77c736..2762e5ec1f5 100644
--- a/source/blender/nodes/shader/nodes/node_shader_holdout.c
+++ b/source/blender/nodes/shader/nodes/node_shader_holdout.c
@@ -30,6 +30,15 @@ static bNodeSocketTemplate sh_node_holdout_out[] = {
     {-1, 0, ""},
 };
 
+static int gpu_shader_rgb(GPUMaterial *mat,
+                          bNode *node,
+                          bNodeExecData *UNUSED(execdata),
+                          GPUNodeStack *in,
+                          GPUNodeStack *out)
+{
+  return GPU_stack_link(mat, node, "node_holdout", in, out);
+}
+
 /* node type definition */
 void register_node_type_sh_holdout(void)
 {
@@ -39,6 +48,7 @@ void register_node_type_sh_holdout(void)
   node_type_socket_templates(&ntype, sh_node_holdout_in, sh_node_holdout_out);
   node_type_init(&ntype, NULL);
   node_type_storage(&ntype, "", NULL, NULL);
+  node_type_gpu(&ntype, gpu_shader_rgb);
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list