[Bf-blender-cvs] [5ca61242078] viewport-compositor: Viewport Compositor: Port Separate/Combine nodes

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


Commit: 5ca61242078b2a66447a97de16191a81698f2efd
Author: Omar Emara
Date:   Sat Nov 13 14:18:36 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB5ca61242078b2a66447a97de16191a81698f2efd

Viewport Compositor: Port Separate/Combine nodes

This patch ports the Separate/Combine nodes 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
M	source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl
A	source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl
M	source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcombYCCA.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcombYUVA.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 157ac93cfc6..c4348698587 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -294,6 +294,7 @@ data_to_c_simple(shaders/composite/gpu_shader_composite_hue_saturation_value.gls
 data_to_c_simple(shaders/composite/gpu_shader_composite_image.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_invert.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_posterize.glsl SRC)
+data_to_c_simple(shaders/composite/gpu_shader_composite_separate_combine.glsl SRC)
 
 data_to_c_simple(shaders/material/gpu_shader_material_add_shader.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_ambient_occlusion.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index fb3acc73eed..bc7c23f4234 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -60,6 +60,7 @@ extern char datatoc_gpu_shader_composite_hue_saturation_value_glsl[];
 extern char datatoc_gpu_shader_composite_image_glsl[];
 extern char datatoc_gpu_shader_composite_invert_glsl[];
 extern char datatoc_gpu_shader_composite_posterize_glsl[];
+extern char datatoc_gpu_shader_composite_separate_combine_glsl[];
 
 extern char datatoc_gpu_shader_material_add_shader_glsl[];
 extern char datatoc_gpu_shader_material_ambient_occlusion_glsl[];
@@ -241,6 +242,11 @@ static GPUMaterialLibrary gpu_shader_composite_posterize_library = {
     .dependencies = {NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_composite_separate_combined_library = {
+    .code = datatoc_gpu_shader_composite_separate_combine_glsl,
+    .dependencies = {&gpu_shader_common_color_util_library, NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_material_noise_library = {
     .code = datatoc_gpu_shader_material_noise_glsl,
     .dependencies = {&gpu_shader_common_hash_library, NULL},
@@ -758,6 +764,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_composite_image_library,
     &gpu_shader_composite_invert_library,
     &gpu_shader_composite_posterize_library,
+    &gpu_shader_composite_separate_combined_library,
     NULL};
 
 /* GLSL code parsing for finding function definitions.
diff --git a/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl b/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl
index c2081482042..eee79fa2e40 100644
--- a/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl
+++ b/source/blender/gpu/shaders/common/gpu_shader_common_color_util.glsl
@@ -90,6 +90,84 @@ void hsv_to_rgb(vec4 hsv, out vec4 outcol)
   outcol = vec4(rgb, hsv.w);
 }
 
+/* ** YCCA to RGBA ** */
+
+void ycca_to_rgba_itu_601(vec4 ycca, out vec4 color)
+{
+  ycca.xyz *= 255.0;
+  ycca.xyz -= vec3(16.0, 128.0, 128.0);
+  color.rgb = mat3(vec3(1.164), 0.0, -0.392, 2.017, 1.596, -0.813, 0.0) * ycca.xyz;
+  color.rgb /= 255.0;
+  color.a = ycca.a;
+}
+
+void ycca_to_rgba_itu_709(vec4 ycca, out vec4 color)
+{
+  ycca.xyz *= 255.0;
+  ycca.xyz -= vec3(16.0, 128.0, 128.0);
+  color.rgb = mat3(vec3(1.164), 0.0, -0.213, 2.115, 1.793, -0.534, 0.0) * ycca.xyz;
+  color.rgb /= 255.0;
+  color.a = ycca.a;
+}
+
+void ycca_to_rgba_jpeg(vec4 ycca, out vec4 color)
+{
+  ycca.xyz *= 255.0;
+  color.rgb = mat3(vec3(1.0), 0.0, -0.34414, 1.772, 1.402, -0.71414, 0.0) * ycca.xyz;
+  color.rgb += vec3(-179.456, 135.45984, -226.816);
+  color.rgb /= 255.0;
+  color.a = ycca.a;
+}
+
+/* ** RGBA to YCCA ** */
+
+void rgba_to_ycca_itu_601(vec4 rgba, out vec4 ycca)
+{
+  rgba.rgb *= 255.0;
+  ycca.xyz = mat3(0.257, -0.148, 0.439, 0.504, -0.291, -0.368, 0.098, 0.439, -0.071) * rgba.rgb;
+  ycca.xyz += vec3(16.0, 128.0, 128.0);
+  ycca.xyz /= 255.0;
+  ycca.a = rgba.a;
+}
+
+void rgba_to_ycca_itu_709(vec4 rgba, out vec4 ycca)
+{
+  rgba.rgb *= 255.0;
+  ycca.xyz = mat3(0.183, -0.101, 0.439, 0.614, -0.338, -0.399, 0.062, 0.439, -0.040) * rgba.rgb;
+  ycca.xyz += vec3(16.0, 128.0, 128.0);
+  ycca.xyz /= 255.0;
+  ycca.a = rgba.a;
+}
+
+void rgba_to_ycca_jpeg(vec4 rgba, out vec4 ycca)
+{
+  rgba.rgb *= 255.0;
+  ycca.xyz = mat3(0.299, -0.16874, 0.5, 0.587, -0.33126, -0.41869, 0.114, 0.5, -0.08131) *
+             rgba.rgb;
+  ycca.xyz += vec3(0.0, 128.0, 128.0);
+  ycca.xyz /= 255.0;
+  ycca.a = rgba.a;
+}
+
+/* ** YUVA to RGBA ** */
+
+void yuva_to_rgba_itu_709(vec4 yuva, out vec4 color)
+{
+  color.rgb = mat3(vec3(1.0), 0.0, -0.21482, 2.12798, 1.28033, -0.38059, 0.0) * yuva.xyz;
+  color.a = yuva.a;
+}
+
+/* ** RGBA to YUVA ** */
+
+void rgba_to_yuva_itu_709(vec4 rgba, out vec4 yuva)
+{
+  yuva.xyz = mat3(0.2126, -0.09991, 0.615, 0.7152, -0.33609, -0.55861, 0.0722, 0.436, -0.05639) *
+             rgba.rgb;
+  yuva.a = rgba.a;
+}
+
+/* ** Alpha Handling ** */
+
 void color_alpha_clear(vec4 color, out vec4 result)
 {
   result = vec4(color.rgb, 1.0);
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl
new file mode 100644
index 00000000000..5a14adf841b
--- /dev/null
+++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_separate_combine.glsl
@@ -0,0 +1,99 @@
+/* ** Combine/Separate RGBA ** */
+
+void node_composite_combine_rgba(float r, float g, float b, float a, out vec4 color)
+{
+  color = vec4(r, g, b, a);
+}
+
+void node_composite_separate_rgba(vec4 color, out float r, out float g, out float b, out float a)
+{
+  r = color.r;
+  g = color.g;
+  b = color.b;
+  a = color.a;
+}
+
+/* ** Combine/Separate HSVA ** */
+
+void node_composite_combine_hsva(float h, float s, float v, float a, out vec4 color)
+{
+  hsv_to_rgb(vec4(h, s, v, a), color);
+}
+
+void node_composite_separate_hsva(vec4 color, out float h, out float s, out float v, out float a)
+{
+  vec4 hsva;
+  rgb_to_hsv(color, hsva);
+  h = hsva.x;
+  s = hsva.y;
+  v = hsva.z;
+  a = hsva.a;
+}
+
+/* ** Combine/Separate YCCA ** */
+
+void node_composite_combine_ycca_itu_601(float y, float cb, float cr, float a, out vec4 color)
+{
+  ycca_to_rgba_itu_601(vec4(y, cb, cr, a), color);
+}
+
+void node_composite_combine_ycca_itu_709(float y, float cb, float cr, float a, out vec4 color)
+{
+  ycca_to_rgba_itu_709(vec4(y, cb, cr, a), color);
+}
+
+void node_composite_combine_ycca_jpeg(float y, float cb, float cr, float a, out vec4 color)
+{
+  ycca_to_rgba_jpeg(vec4(y, cb, cr, a), color);
+}
+
+void node_composite_separate_ycca_itu_601(
+    vec4 color, out float y, out float cb, out float cr, out float a)
+{
+  vec4 ycca;
+  rgba_to_ycca_itu_601(color, ycca);
+  y = ycca.x;
+  cb = ycca.y;
+  cr = ycca.z;
+  a = ycca.a;
+}
+
+void node_composite_separate_ycca_itu_709(
+    vec4 color, out float y, out float cb, out float cr, out float a)
+{
+  vec4 ycca;
+  rgba_to_ycca_itu_709(color, ycca);
+  y = ycca.x;
+  cb = ycca.y;
+  cr = ycca.z;
+  a = ycca.a;
+}
+
+void node_composite_separate_ycca_jpeg(
+    vec4 color, out float y, out float cb, out float cr, out float a)
+{
+  vec4 ycca;
+  rgba_to_ycca_jpeg(color, ycca);
+  y = ycca.x;
+  cb = ycca.y;
+  cr = ycca.z;
+  a = ycca.a;
+}
+
+/* ** Combine/Separate YUVA ** */
+
+void node_composite_combine_yuva_itu_709(float y, float u, float v, float a, out vec4 color)
+{
+  yuva_to_rgba_itu_709(vec4(y, u, v, a), color);
+}
+
+void node_composite_separate_yuva_itu_709(
+    vec4 color, out float y, out float u, out float v, out float a)
+{
+  vec4 yuva;
+  rgba_to_yuva_itu_709(color, yuva);
+  y = yuva.x;
+  u = yuva.y;
+  v = yuva.z;
+  a = yuva.a;
+}
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc
index 17b1ab9ac59..65080c2c5b0 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombHSVA.cc
@@ -36,12 +36,22 @@ static bNodeSocketTemplate cmp_node_sephsva_out[] = {
     {-1, ""},
 };
 
+static int node_composite_gpu_sephsva(GPUMaterial *mat,
+                                      bNode *node,
+                                      bNodeExecData *UNUSED(execdata),
+                                      GPUNodeStack *in,
+                                      GPUNodeStack *out)
+{
+  return GPU_stack_link(mat, node, "node_composite_separate_hsva", in, out);
+}
+
 void register_node_type_cmp_sephsva(void)
 {
   static bNodeType ntype;
 
   cmp_node_type_base(&ntype, CMP_NODE_SEPHSVA, "Separate HSVA", NODE_CLASS_CONVERTER, 0);
   node_type_socket_templates(&ntype, cmp_node_sephsva_in, cmp_node_sephsva_out);
+  node_type_gpu(&ntype, node_composite_gpu_sephsva);
 
   nodeRegisterType(&ntype);
 }
@@ -59,12 +69,22 @@ static bNodeSocketTemplate cmp_node_combhsva_out[] = {
     {-1, ""},
 };
 
+static int node_composite_gpu_combhsva(GPUMaterial *mat,
+                                       bNode *node,
+                                       bNodeExecData *UNUSED(execdata),
+                                       GPUNodeStack *in,
+                                       GPUNodeStack *out)
+{
+  return GPU_stack_link(mat, node, "node_composite_combine_hsva", in, out);
+}
+
 void register_node_type_cmp_combhsva(void)
 {
   static bNodeType ntype;
 
   cmp_node_type_base(&ntype, CMP_NODE_COMBHSVA, "Combine HSVA", NODE_CLASS_CONVERTER, 0);
   node_type_socket_templates(&ntype, cmp_node_combhsva_in, cmp_node_combhsva_out);
+  node_type_gpu(&ntype, node_composite_gpu_combhsva);
 
   nodeRegisterType(&ntype);
 }
diff --git a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc
index d3a021ed7ba..d4ee8fe3b00 100644
--- a/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_sepcombRGBA.cc
@@ -36,12 +36,22 @@ static bNodeSocketTemplate cmp_node_seprgba_out[] = {
     {-1, ""},
 };
 
+static int node_composite_gpu_seprgba(GPUMaterial *mat,
+                                      bNode *node,
+                                      bNodeExecData *UNUSED(execdata),
+                  

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list