[Bf-blender-cvs] [88907357c26] viewport-compositor: Viewport Compositor: Port Hue Correct node

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


Commit: 88907357c26f996a1f9ad5da5116b7cd3c930eae
Author: Omar Emara
Date:   Thu Nov 4 13:15:37 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB88907357c26f996a1f9ad5da5116b7cd3c930eae

Viewport Compositor: Port Hue Correct node

This patch ports the Hue Correct 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_hue_correct.glsl
M	source/blender/nodes/composite/nodes/node_composite_huecorrect.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index 1c918ae8694..836125c1f0d 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -286,6 +286,7 @@ data_to_c_simple(shaders/composite/gpu_shader_composite_color_correction.glsl SR
 data_to_c_simple(shaders/composite/gpu_shader_composite_composite.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_exposure.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_gamma.glsl SRC)
+data_to_c_simple(shaders/composite/gpu_shader_composite_hue_correct.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_image.glsl SRC)
 data_to_c_simple(shaders/composite/gpu_shader_composite_invert.glsl SRC)
 
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index c47644939aa..7bb6d4f1a43 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -52,6 +52,7 @@ extern char datatoc_gpu_shader_composite_color_correction_glsl[];
 extern char datatoc_gpu_shader_composite_composite_glsl[];
 extern char datatoc_gpu_shader_composite_exposure_glsl[];
 extern char datatoc_gpu_shader_composite_gamma_glsl[];
+extern char datatoc_gpu_shader_composite_hue_correct_glsl[];
 extern char datatoc_gpu_shader_composite_image_glsl[];
 extern char datatoc_gpu_shader_composite_invert_glsl[];
 
@@ -199,6 +200,11 @@ static GPUMaterialLibrary gpu_shader_composite_gamma_library = {
     .dependencies = {&gpu_shader_common_math_util_library, NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_composite_hue_correct_library = {
+    .code = datatoc_gpu_shader_composite_hue_correct_glsl,
+    .dependencies = {&gpu_shader_common_color_util_library, NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_composite_image_library = {
     .code = datatoc_gpu_shader_composite_image_glsl,
     .dependencies = {NULL},
@@ -742,6 +748,7 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_composite_composite_library,
     &gpu_shader_composite_exposure_library,
     &gpu_shader_composite_gamma_library,
+    &gpu_shader_composite_hue_correct_library,
     &gpu_shader_composite_image_library,
     &gpu_shader_composite_invert_library,
     NULL};
diff --git a/source/blender/gpu/shaders/composite/gpu_shader_composite_hue_correct.glsl b/source/blender/gpu/shaders/composite/gpu_shader_composite_hue_correct.glsl
new file mode 100644
index 00000000000..cdccc27cd8d
--- /dev/null
+++ b/source/blender/gpu/shaders/composite/gpu_shader_composite_hue_correct.glsl
@@ -0,0 +1,24 @@
+void node_composite_hue_correct(float factor,
+                                vec4 color,
+                                sampler1DArray curve_map,
+                                const float layer,
+                                vec3 min_hsv,
+                                vec3 range_hsv,
+                                out vec4 result)
+{
+  vec4 hsv;
+  rgb_to_hsv(color, hsv);
+  vec3 parameters = (hsv.x - min_hsv) * range_hsv;
+
+  /* A value of 0.5 means no change, so adjust to get an identity at 0.5. */
+  hsv.x += texture(curve_map, vec2(parameters.x, layer)).x - 0.5;
+  hsv.y *= texture(curve_map, vec2(parameters.y, layer)).y * 2.0;
+  hsv.z *= texture(curve_map, vec2(parameters.z, layer)).z * 2.0;
+
+  hsv.x = fract(hsv.x);
+  hsv.y = clamp(hsv.y, 0.0, 1.0);
+
+  hsv_to_rgb(hsv, result);
+
+  result = mix(color, result, factor);
+}
diff --git a/source/blender/nodes/composite/nodes/node_composite_huecorrect.cc b/source/blender/nodes/composite/nodes/node_composite_huecorrect.cc
index 39014896a7b..27b52cd2120 100644
--- a/source/blender/nodes/composite/nodes/node_composite_huecorrect.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_huecorrect.cc
@@ -51,6 +51,40 @@ static void node_composit_init_huecorrect(bNodeTree *UNUSED(ntree), bNode *node)
   cumapping->cur = 1;
 }
 
+static int node_composite_gpu_huecorrect(GPUMaterial *mat,
+                                         bNode *node,
+                                         bNodeExecData *UNUSED(execdata),
+                                         GPUNodeStack *in,
+                                         GPUNodeStack *out)
+{
+  CurveMapping *curve_mapping = (CurveMapping *)node->storage;
+
+  BKE_curvemapping_init(curve_mapping);
+  float *band_values;
+  int band_size;
+  BKE_curvemapping_table_RGBA(curve_mapping, &band_values, &band_size);
+  float band_layer;
+  GPUNodeLink *band_texture = GPU_color_band(mat, band_size, band_values, &band_layer);
+
+  float min_hsv[3];
+  float range_hsv[3];
+  for (int i = 0; i < 3; i++) {
+    const CurveMap &curve_map = curve_mapping->cm[i];
+    min_hsv[i] = curve_map.mintable;
+    range_hsv[i] = 1.0f / max_ff(1e-8f, curve_map.maxtable - curve_map.mintable);
+  }
+
+  return GPU_stack_link(mat,
+                        node,
+                        "node_composite_hue_correct",
+                        in,
+                        out,
+                        band_texture,
+                        GPU_constant(&band_layer),
+                        GPU_uniform(min_hsv),
+                        GPU_uniform(range_hsv));
+}
+
 void register_node_type_cmp_huecorrect(void)
 {
   static bNodeType ntype;
@@ -60,6 +94,7 @@ void register_node_type_cmp_huecorrect(void)
   node_type_size(&ntype, 320, 140, 500);
   node_type_init(&ntype, node_composit_init_huecorrect);
   node_type_storage(&ntype, "CurveMapping", node_free_curves, node_copy_curves);
+  node_type_gpu(&ntype, node_composite_gpu_huecorrect);
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list