[Bf-blender-cvs] [4516e86668d] viewport-compositor: Viewport Compositor: Port Color Key node

Omar Emara noreply at git.blender.org
Tue Dec 28 20:02:45 CET 2021


Commit: 4516e86668d1c26798d827de323232308d9d5add
Author: Omar Emara
Date:   Wed Nov 17 13:29:58 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB4516e86668d1c26798d827de323232308d9d5add

Viewport Compositor: Port Color Key node

This patch ports the Color Key node to the viewport compositor. The
shader is a straightforward port of the compositor code.

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_material_library.c
A	source/blender/gpu/shaders/composite/gpu_shader_composite_color_matte.glsl
M	source/blender/nodes/composite/nodes/node_composite_colorMatte.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index f218305759f..4bb1a508afc 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -290,6 +290,7 @@ data_to_c_simple(shaders/composite/gpu_shader_composite_channel_matte.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_chroma_matte.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_color_balance.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_color_correction.glsl SRC)
+data_to_c_simple(shaders/composite/gpu_shader_composite_color_matte.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_color_to_luminance.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_composite.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_ellipse_mask.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index a2df675d45d..9b7588c9912 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -56,6 +56,7 @@ extern char datatoc_gpu_shader_composite_channel_matte_glsl[];
 extern char datatoc_gpu_shader_composite_chroma_matte_glsl[];
 extern char datatoc_gpu_shader_composite_color_balance_glsl[];
 extern char datatoc_gpu_shader_composite_color_correction_glsl[];
+extern char datatoc_gpu_shader_composite_color_matte_glsl[];
 extern char datatoc_gpu_shader_composite_color_to_luminance_glsl[];
 extern char datatoc_gpu_shader_composite_composite_glsl[];
 extern char datatoc_gpu_shader_composite_ellipse_mask_glsl[];
@@ -233,6 +234,11 @@ static GPUMaterialLibrary gpu_shader_composite_color_correction_library = {
                      NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_composite_color_matte_library = {
+    .code = datatoc_gpu_shader_composite_color_matte_glsl,
+    .dependencies = {&gpu_shader_common_color_util_library, NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_composite_color_to_luminance_library = {
     .code = datatoc_gpu_shader_composite_color_to_luminance_glsl,
     .dependencies = {&gpu_shader_common_color_util_library, NULL},
@@ -815,6 +821,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_composite_chroma_matte_library,
     &gpu_shader_composite_color_balance_library,
     &gpu_shader_composite_color_correction_library,
+    &gpu_shader_composite_color_matte_library,
     &gpu_shader_composite_color_to_luminance_library,
     &gpu_shader_composite_composite_library,
     &gpu_shader_composite_ellipse_mask_library,
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_color_matte.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_color_matte.glsl
new file mode 100644
index 00000000000..745c39f048f
--- /dev/null
+++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_color_matte.glsl
@@ -0,0 +1,25 @@
+void node_composite_color_matte(vec4 color,
+                                vec4 key,
+                                float hue_epsilon,
+                                float saturation_epsilon,
+                                float value_epsilon,
+                                out vec4 result,
+                                out float matte)
+
+{
+  vec4 color_hsva;
+  rgb_to_hsv(color, color_hsva);
+  vec4 key_hsva;
+  rgb_to_hsv(key, key_hsva);
+
+  bool is_within_saturation = distance(color_hsva.y, key_hsva.y) < saturation_epsilon;
+  bool is_within_value = distance(color_hsva.z, key_hsva.z) < value_epsilon;
+  bool is_within_hue = distance(color_hsva.x, key_hsva.x) < hue_epsilon;
+  /* Hue wraps around, so check the distance around the boundary. */
+  float min_hue = min(color_hsva.x, key_hsva.x);
+  float max_hue = max(color_hsva.x, key_hsva.x);
+  is_within_hue = is_within_hue || ((min_hue + (1.0 - max_hue)) < hue_epsilon);
+
+  matte = (is_within_hue && is_within_saturation && is_within_value) ? 0.0 : color.a;
+  result = color * matte;
+}
diff --git a/source/blender/nodes/composite/nodes/node_composite_colorMatte.cc b/source/blender/nodes/composite/nodes/node_composite_colorMatte.cc
index fc9a0075b14..457cb3fba6b 100644
--- a/source/blender/nodes/composite/nodes/node_composite_colorMatte.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_colorMatte.cc
@@ -47,6 +47,27 @@ static void node_composit_init_color_matte(bNodeTree *UNUSED(ntree), bNode *node
   c->fstrength = 1.0f;
 }
 
+static int node_composite_gpu_color_matte(GPUMaterial *mat,
+                                          bNode *node,
+                                          bNodeExecData *UNUSED(execdata),
+                                          GPUNodeStack *in,
+                                          GPUNodeStack *out)
+{
+  const NodeChroma *data = (NodeChroma *)node->storage;
+
+  /* Because the Hue wraps around. */
+  const float hue_epsilon = data->t1 / 2.0f;
+
+  return GPU_stack_link(mat,
+                        node,
+                        "node_composite_color_matte",
+                        in,
+                        out,
+                        GPU_uniform(&hue_epsilon),
+                        GPU_uniform(&data->t2),
+                        GPU_uniform(&data->t3));
+}
+
 void register_node_type_cmp_color_matte(void)
 {
   static bNodeType ntype;
@@ -55,6 +76,7 @@ void register_node_type_cmp_color_matte(void)
   node_type_socket_templates(&ntype, cmp_node_color_in, cmp_node_color_out);
   node_type_init(&ntype, node_composit_init_color_matte);
   node_type_storage(&ntype, "NodeChroma", node_free_standard_storage, node_copy_standard_storage);
+  node_type_gpu(&ntype, node_composite_gpu_color_matte);
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list