[Bf-blender-cvs] [b5df7a02ac7] master: Realtime Compositor: Add basic convert and vector nodes

Omar Emara noreply at git.blender.org
Wed Aug 10 10:11:05 CEST 2022


Commit: b5df7a02ac754de8e04fdeda4d1c3f0fcdf6a7a2
Author: Omar Emara
Date:   Wed Aug 10 10:09:35 2022 +0200
Branches: master
https://developer.blender.org/rBb5df7a02ac754de8e04fdeda4d1c3f0fcdf6a7a2

Realtime Compositor: Add basic convert and vector nodes

This patch implements the following nodes for the realtime compositor:

- Map range node.
- Map value node.
- Math node.
- Normal node.
- Alpha convert node.
- Separate color node.
- Combine color node.
- Separate XYZ node.
- Combine XYZ node.
- Separate RGBA node.
- Combine RGBA node.
- Separate HSVA node.
- Combine HSVA node.
- Separate YCCA node.
- Combine YUVA node.
- Set alpha node.
- Switch node.
- Switch view node.
- RGB to BW node.
- Color ramp node.

Differential Revision: https://developer.blender.org/D15229

Reviewed By: Clement Foucault

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/shaders/common/gpu_shader_common_color_utils.glsl
A	source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_color_to_luminance.glsl
A	source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_map_value.glsl
A	source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_normal.glsl
A	source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
A	source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_set_alpha.glsl
M	source/blender/makesdna/DNA_node_types.h
M	source/blender/nodes/composite/CMakeLists.txt
M	source/blender/nodes/composite/nodes/node_composite_map_range.cc
M	source/blender/nodes/composite/nodes/node_composite_map_value.cc
M	source/blender/nodes/composite/nodes/node_composite_math.cc
M	source/blender/nodes/composite/nodes/node_composite_normal.cc
M	source/blender/nodes/composite/nodes/node_composite_premulkey.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_color.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_hsva.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_rgba.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_xyz.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_ycca.cc
M	source/blender/nodes/composite/nodes/node_composite_sepcomb_yuva.cc
M	source/blender/nodes/composite/nodes/node_composite_setalpha.cc
M	source/blender/nodes/composite/nodes/node_composite_switch.cc
M	source/blender/nodes/composite/nodes/node_composite_switchview.cc
M	source/blender/nodes/composite/nodes/node_composite_val_to_rgb.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 9c7fb8f290f..995771847c1 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -332,13 +332,18 @@ set(GLSL_SRC
   shaders/compositor/library/gpu_shader_compositor_bright_contrast.glsl
   shaders/compositor/library/gpu_shader_compositor_color_balance.glsl
   shaders/compositor/library/gpu_shader_compositor_color_correction.glsl
+  shaders/compositor/library/gpu_shader_compositor_color_to_luminance.glsl
   shaders/compositor/library/gpu_shader_compositor_exposure.glsl
   shaders/compositor/library/gpu_shader_compositor_gamma.glsl
   shaders/compositor/library/gpu_shader_compositor_hue_correct.glsl
   shaders/compositor/library/gpu_shader_compositor_hue_saturation_value.glsl
   shaders/compositor/library/gpu_shader_compositor_invert.glsl
   shaders/compositor/library/gpu_shader_compositor_main.glsl
+  shaders/compositor/library/gpu_shader_compositor_map_value.glsl
+  shaders/compositor/library/gpu_shader_compositor_normal.glsl
   shaders/compositor/library/gpu_shader_compositor_posterize.glsl
+  shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
+  shaders/compositor/library/gpu_shader_compositor_set_alpha.glsl
   shaders/compositor/library/gpu_shader_compositor_store_output.glsl
   shaders/compositor/library/gpu_shader_compositor_texture_utilities.glsl
   shaders/compositor/library/gpu_shader_compositor_type_conversion.glsl
diff --git a/source/blender/gpu/shaders/common/gpu_shader_common_color_utils.glsl b/source/blender/gpu/shaders/common/gpu_shader_common_color_utils.glsl
index 2ac0ff8c4bb..33108d3a989 100644
--- a/source/blender/gpu/shaders/common/gpu_shader_common_color_utils.glsl
+++ b/source/blender/gpu/shaders/common/gpu_shader_common_color_utils.glsl
@@ -140,6 +140,82 @@ void hsl_to_rgb(vec4 hsl, out vec4 outcol)
   outcol = vec4((nr - 0.5) * chroma + l, (ng - 0.5) * chroma + l, (nb - 0.5) * chroma + l, hsl.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)
diff --git a/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_color_to_luminance.glsl b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_color_to_luminance.glsl
new file mode 100644
index 00000000000..bcdd625bd4f
--- /dev/null
+++ b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_color_to_luminance.glsl
@@ -0,0 +1,6 @@
+#pragma BLENDER_REQUIRE(gpu_shader_common_color_utils.glsl)
+
+void color_to_luminance(vec4 color, const vec3 luminance_coefficients, out float result)
+{
+  result = get_luminance(color.rgb, luminance_coefficients);
+}
diff --git a/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_map_value.glsl b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_map_value.glsl
new file mode 100644
index 00000000000..20874b4ef44
--- /dev/null
+++ b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_map_value.glsl
@@ -0,0 +1,56 @@
+/* An arbitrary value determined by Blender. */
+#define BLENDER_ZMAX 10000.0
+
+void node_composite_map_range(float value,
+                              float from_min,
+                              float from_max,
+                              float to_min,
+                              float to_max,
+                              const float should_clamp,
+                              out float result)
+{
+  if (abs(from_max - from_min) < 1e-6) {
+    result = 0.0;
+  }
+  else {
+    if (value >= -BLENDER_ZMAX && value <= BLENDER_ZMAX) {
+      result = (value - from_min) / (from_max - from_min);
+      result = to_min + result * (to_max - to_min);
+    }
+    else if (value > BLENDER_ZMAX) {
+      result = to_max;
+    }
+    else {
+      result = to_min;
+    }
+
+    if (should_clamp != 0.0) {
+      if (to_max > to_min) {
+        result = clamp(result, to_min, to_max);
+      }
+      else {
+        result = clamp(result, to_max, to_min);
+      }
+    }
+  }
+}
+
+void node_composite_map_value(float value,
+                              float offset,
+                              float size,
+                              const float use_min,
+                              float min,
+                              const float use_max,
+                              float max,
+                              out float result)
+{
+  result = (value + offset) * size;
+
+  if (use_min != 0.0 && result < min) {
+    result = min;
+  }
+
+  if (use_max != 0.0 && result > max) {
+    result = max;
+  }
+}
diff --git a/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_normal.glsl b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_normal.glsl
new file mode 100644
index 00000000000..a2e3b6c4aaa
--- /dev/null
+++ b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_normal.glsl
@@ -0,0 +1,9 @@
+void node_composite_normal(vec3 input_vector,
+                           vec3 input_normal,
+                           out vec3 result_normal,
+                           out float result_dot)
+{
+  vec3 normal = normalize(input_normal);
+  result_normal = normal;
+  result_dot = -dot(input_vector, normal);
+}
diff --git a/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
new file mode 100644
index 00000000000..d72d2260394
--- /dev/null
+++ b/source/blender/gpu/shaders/compositor/library/gpu_shader_compositor_separate_combine.glsl
@@ -0,0 +1,132 @@
+#pragma BLENDER_REQUIRE(gpu_shader_common_color_utils.glsl)
+
+/* ** Combine/Separate XYZ ** */
+
+void node_composite_combine_xyz(float x, float y, float z, out vec3 vector)
+{
+  vector = vec3(x, y, z);
+}
+
+void node_composite_separate_xyz(vec3 vector, out float x, out float y, out float z)
+{
+  x = vector.x;
+  y = vector.y;
+  z = vector.z;
+}
+
+/* ** 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 HSLA ** */
+
+void node_composite_combine_hsla(float h, float s, float l, float a, out vec4 color)
+{
+  hsl_to_rgb(vec4(h, s, l, a), color);
+}
+
+void node_composite_separate_hsla(vec4 color, out float h, out float s, out float l, out float a)
+{
+  vec4 hsla;
+  rgb_to_hsl(color, hsla);
+  h = hsla.x;
+  s = hsla.y;
+  l = hsla.z;
+  a = hsla.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_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list