[Bf-blender-cvs] [5ed9bb563e4] viewport-compositor: Viewport Compositor: Port Color Ramp node

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


Commit: 5ed9bb563e4101cb08ae06a6cb8a6f35794fef0a
Author: Omar Emara
Date:   Fri Nov 12 18:00:16 2021 +0200
Branches: viewport-compositor
https://developer.blender.org/rB5ed9bb563e4101cb08ae06a6cb8a6f35794fef0a

Viewport Compositor: Port Color Ramp node

This patch ports the Color Ramp node to the viewport compositor. The
shading color ramp shader was moved into a common directory to be used
by both materials and the compositor.

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

M	source/blender/gpu/CMakeLists.txt
M	source/blender/gpu/intern/gpu_material_library.c
R100	source/blender/gpu/shaders/material/gpu_shader_material_color_ramp.glsl	source/blender/gpu/shaders/common/gpu_shader_common_color_ramp.glsl
M	source/blender/nodes/composite/nodes/node_composite_valToRgb.cc

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

diff --git a/source/blender/gpu/CMakeLists.txt b/source/blender/gpu/CMakeLists.txt
index d5de5722dfe..157ac93cfc6 100644
--- a/source/blender/gpu/CMakeLists.txt
+++ b/source/blender/gpu/CMakeLists.txt
@@ -275,6 +275,7 @@ data_to_c_simple(shaders/gpu_shader_codegen_lib.glsl SRC)
 
 data_to_c_simple(shaders/gpu_shader_geometry.glsl SRC)
 
+data_to_c_simple(shaders/common/gpu_shader_common_color_ramp.glsl SRC)
 data_to_c_simple(shaders/common/gpu_shader_common_color_util.glsl SRC)
 data_to_c_simple(shaders/common/gpu_shader_common_curves.glsl SRC)
 data_to_c_simple(shaders/common/gpu_shader_common_math_util.glsl SRC)
@@ -306,7 +307,6 @@ data_to_c_simple(shaders/material/gpu_shader_material_bright_contrast.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_bump.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_camera.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_clamp.glsl SRC)
-data_to_c_simple(shaders/material/gpu_shader_material_color_ramp.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_combine_hsv.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_combine_rgb.glsl SRC)
 data_to_c_simple(shaders/material/gpu_shader_material_combine_xyz.glsl SRC)
diff --git a/source/blender/gpu/intern/gpu_material_library.c b/source/blender/gpu/intern/gpu_material_library.c
index 38930dd9293..fb3acc73eed 100644
--- a/source/blender/gpu/intern/gpu_material_library.c
+++ b/source/blender/gpu/intern/gpu_material_library.c
@@ -41,6 +41,7 @@
  * If a file uses functions from another file, it must be added to the list of
  * dependencies, and be placed after that file in the list. */
 
+extern char datatoc_gpu_shader_common_color_ramp_glsl[];
 extern char datatoc_gpu_shader_common_color_util_glsl[];
 extern char datatoc_gpu_shader_common_curves_glsl[];
 extern char datatoc_gpu_shader_common_math_util_glsl[];
@@ -72,7 +73,6 @@ extern char datatoc_gpu_shader_material_bright_contrast_glsl[];
 extern char datatoc_gpu_shader_material_bump_glsl[];
 extern char datatoc_gpu_shader_material_camera_glsl[];
 extern char datatoc_gpu_shader_material_clamp_glsl[];
-extern char datatoc_gpu_shader_material_color_ramp_glsl[];
 extern char datatoc_gpu_shader_material_combine_hsv_glsl[];
 extern char datatoc_gpu_shader_material_combine_rgb_glsl[];
 extern char datatoc_gpu_shader_material_combine_xyz_glsl[];
@@ -155,6 +155,11 @@ static GPUMaterialLibrary gpu_shader_common_color_util_library = {
     .dependencies = {NULL},
 };
 
+static GPUMaterialLibrary gpu_shader_common_color_ramp_library = {
+    .code = datatoc_gpu_shader_common_color_ramp_glsl,
+    .dependencies = {NULL},
+};
+
 static GPUMaterialLibrary gpu_shader_common_curves_library = {
     .code = datatoc_gpu_shader_common_curves_glsl,
     .dependencies = {NULL},
@@ -311,11 +316,6 @@ static GPUMaterialLibrary gpu_shader_material_clamp_library = {
     .dependencies = {NULL},
 };
 
-static GPUMaterialLibrary gpu_shader_material_color_ramp_library = {
-    .code = datatoc_gpu_shader_material_color_ramp_glsl,
-    .dependencies = {NULL},
-};
-
 static GPUMaterialLibrary gpu_shader_material_combine_hsv_library = {
     .code = datatoc_gpu_shader_material_combine_hsv_glsl,
     .dependencies = {&gpu_shader_common_color_util_library, NULL},
@@ -657,6 +657,7 @@ static GPUMaterialLibrary gpu_shader_material_world_normals_library = {
 };
 
 static GPUMaterialLibrary *gpu_material_libraries[] = {
+    &gpu_shader_common_color_ramp_library,
     &gpu_shader_common_math_util_library,
     &gpu_shader_common_color_util_library,
     &gpu_shader_common_curves_library,
@@ -677,7 +678,6 @@ static GPUMaterialLibrary *gpu_material_libraries[] = {
     &gpu_shader_material_bump_library,
     &gpu_shader_material_camera_library,
     &gpu_shader_material_clamp_library,
-    &gpu_shader_material_color_ramp_library,
     &gpu_shader_material_combine_hsv_library,
     &gpu_shader_material_combine_rgb_library,
     &gpu_shader_material_combine_xyz_library,
diff --git a/source/blender/gpu/shaders/material/gpu_shader_material_color_ramp.glsl b/source/blender/gpu/shaders/common/gpu_shader_common_color_ramp.glsl
similarity index 100%
rename from source/blender/gpu/shaders/material/gpu_shader_material_color_ramp.glsl
rename to source/blender/gpu/shaders/common/gpu_shader_common_color_ramp.glsl
diff --git a/source/blender/nodes/composite/nodes/node_composite_valToRgb.cc b/source/blender/nodes/composite/nodes/node_composite_valToRgb.cc
index ece52dea269..dbe79b93908 100644
--- a/source/blender/nodes/composite/nodes/node_composite_valToRgb.cc
+++ b/source/blender/nodes/composite/nodes/node_composite_valToRgb.cc
@@ -39,6 +39,67 @@ static void node_composit_init_valtorgb(bNodeTree *UNUSED(ntree), bNode *node)
   node->storage = BKE_colorband_add(true);
 }
 
+static int node_composite_gpu_valtorgb(GPUMaterial *mat,
+                                       bNode *node,
+                                       bNodeExecData *UNUSED(execdata),
+                                       GPUNodeStack *in,
+                                       GPUNodeStack *out)
+{
+  struct ColorBand *coba = (ColorBand *)node->storage;
+  float *array, layer;
+  int size;
+
+  /* Common / easy case optimization. */
+  if ((coba->tot <= 2) && (coba->color_mode == COLBAND_BLEND_RGB)) {
+    float mul_bias[2];
+    switch (coba->ipotype) {
+      case COLBAND_INTERP_LINEAR:
+        mul_bias[0] = 1.0f / (coba->data[1].pos - coba->data[0].pos);
+        mul_bias[1] = -mul_bias[0] * coba->data[0].pos;
+        return GPU_stack_link(mat,
+                              node,
+                              "valtorgb_opti_linear",
+                              in,
+                              out,
+                              GPU_uniform(mul_bias),
+                              GPU_uniform(&coba->data[0].r),
+                              GPU_uniform(&coba->data[1].r));
+      case COLBAND_INTERP_CONSTANT:
+        mul_bias[1] = max_ff(coba->data[0].pos, coba->data[1].pos);
+        return GPU_stack_link(mat,
+                              node,
+                              "valtorgb_opti_constant",
+                              in,
+                              out,
+                              GPU_uniform(&mul_bias[1]),
+                              GPU_uniform(&coba->data[0].r),
+                              GPU_uniform(&coba->data[1].r));
+      case COLBAND_INTERP_EASE:
+        mul_bias[0] = 1.0f / (coba->data[1].pos - coba->data[0].pos);
+        mul_bias[1] = -mul_bias[0] * coba->data[0].pos;
+        return GPU_stack_link(mat,
+                              node,
+                              "valtorgb_opti_ease",
+                              in,
+                              out,
+                              GPU_uniform(mul_bias),
+                              GPU_uniform(&coba->data[0].r),
+                              GPU_uniform(&coba->data[1].r));
+      default:
+        break;
+    }
+  }
+
+  BKE_colorband_evaluate_table_rgba(coba, &array, &size);
+  GPUNodeLink *tex = GPU_color_band(mat, size, array, &layer);
+
+  if (coba->ipotype == COLBAND_INTERP_CONSTANT) {
+    return GPU_stack_link(mat, node, "valtorgb_nearest", in, out, tex, GPU_constant(&layer));
+  }
+
+  return GPU_stack_link(mat, node, "valtorgb", in, out, tex, GPU_constant(&layer));
+}
+
 void register_node_type_cmp_valtorgb(void)
 {
   static bNodeType ntype;
@@ -48,6 +109,7 @@ void register_node_type_cmp_valtorgb(void)
   node_type_size(&ntype, 240, 200, 320);
   node_type_init(&ntype, node_composit_init_valtorgb);
   node_type_storage(&ntype, "ColorBand", node_free_standard_storage, node_copy_standard_storage);
+  node_type_gpu(&ntype, node_composite_gpu_valtorgb);
 
   nodeRegisterType(&ntype);
 }



More information about the Bf-blender-cvs mailing list