[Bf-blender-cvs] [c42ceb93c93] greasepencil-refactor: GPencil: Refactor: Put blend mode shader code into gpencil_common_lib.glsl

Clément Foucault noreply at git.blender.org
Thu Dec 19 01:31:00 CET 2019


Commit: c42ceb93c93fcc2692733954d895e1b14955fb74
Author: Clément Foucault
Date:   Wed Dec 18 23:07:38 2019 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rBc42ceb93c93fcc2692733954d895e1b14955fb74

GPencil: Refactor: Put blend mode shader code into gpencil_common_lib.glsl

This is because the rim fx needs the same code.

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

M	source/blender/draw/engines/gpencil/gpencil_shader.c
M	source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
M	source/blender/draw/engines/gpencil/shaders/gpencil_layer_blend_frag.glsl

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_shader.c b/source/blender/draw/engines/gpencil/gpencil_shader.c
index 7533ebff48f..60bfdf9ccce 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader.c
@@ -75,8 +75,19 @@ struct GPUShader *GPENCIL_shader_composite_get(GPENCIL_e_data *e_data)
 struct GPUShader *GPENCIL_shader_layer_blend_get(GPENCIL_e_data *e_data)
 {
   if (!e_data->layer_blend_sh) {
-    e_data->layer_blend_sh = DRW_shader_create_fullscreen(datatoc_gpencil_layer_blend_frag_glsl,
-                                                          NULL);
+    e_data->layer_blend_sh = GPU_shader_create_from_arrays({
+        .vert =
+            (const char *[]){
+                datatoc_common_fullscreen_vert_glsl,
+                NULL,
+            },
+        .frag =
+            (const char *[]){
+                datatoc_gpencil_common_lib_glsl,
+                datatoc_gpencil_layer_blend_frag_glsl,
+                NULL,
+            },
+    });
   }
   return e_data->layer_blend_sh;
 }
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
index 319bf7cbb07..690cbb2298c 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_common_lib.glsl
@@ -35,7 +35,71 @@ struct gpMaterial {
 
 #define GP_FLAG_TEST(flag, val) (((flag) & (val)) != 0)
 
+#ifdef GPENCIL_MATERIAL_BUFFER_LEN
+
 layout(std140) uniform gpMaterialBlock
 {
   gpMaterial materials[GPENCIL_MATERIAL_BUFFER_LEN];
 };
+
+#endif
+
+/* Must match eGPLayerBlendModes */
+#define MODE_REGULAR 0
+#define MODE_OVERLAY 1
+#define MODE_ADD 2
+#define MODE_SUB 3
+#define MODE_MULTIPLY 4
+#define MODE_DIVIDE 5
+#define MODE_OVERLAY_SECOND_PASS 999
+
+void blend_mode_output(
+    int blend_mode, vec4 color, float opacity, out vec4 frag_color, out vec4 frag_revealage)
+{
+  switch (blend_mode) {
+    case MODE_REGULAR:
+      /* Reminder: Blending func is premult alpha blend (dst.rgba * (1 - src.a) + src.rgb).*/
+      color *= opacity;
+      frag_color = color;
+      frag_revealage = vec4(0.0, 0.0, 0.0, color.a);
+      break;
+    case MODE_MULTIPLY:
+      /* Reminder: Blending func is multiply blend (dst.rgba * src.rgba).*/
+      color.a *= opacity;
+      frag_revealage = frag_color = (1.0 - color.a) + color.a * color;
+      break;
+    case MODE_DIVIDE:
+      /* Reminder: Blending func is multiply blend (dst.rgba * src.rgba).*/
+      color.a *= opacity;
+      frag_revealage = frag_color = clamp(1.0 / (1.0 - color * color.a), 0.0, 1e18);
+      break;
+    case MODE_OVERLAY:
+      /* Reminder: Blending func is multiply blend (dst.rgba * src.rgba).*/
+      /**
+       * We need to separate the overlay equation into 2 term (one mul and one add).
+       * This is the standard overlay equation (per channel):
+       * rtn = (src < 0.5) ? (2.0 * src * dst) : (1.0 - 2.0 * (1.0 - src) * (1.0 - dst));
+       * We rewrite the second branch like this:
+       * rtn = 1 - 2 * (1 - src) * (1 - dst);
+       * rtn = 1 - 2 (1 - dst + src * dst - src);
+       * rtn = 1 - 2 (1 - dst * (1 - src) - src);
+       * rtn = 1 - 2 + dst * (2 - 2 * src) + 2 * src;
+       * rtn = (- 1 + 2 * src) + dst * (2 - 2 * src);
+       **/
+      color = mix(vec4(0.5), color, color.a * opacity);
+      vec4 s = step(-0.5, -color);
+      frag_revealage = frag_color = 2.0 * s + 2.0 * color * (1.0 - s * 2.0);
+      break;
+    case MODE_OVERLAY_SECOND_PASS:
+      /* Reminder: Blending func is additive blend (dst.rgba + src.rgba).*/
+      color = mix(vec4(0.5), color, color.a * opacity);
+      frag_revealage = frag_color = (-1.0 + 2.0 * color) * step(-0.5, -color);
+      break;
+    case MODE_SUB:
+    case MODE_ADD:
+      /* Reminder: Blending func is additive / subtractive blend (dst.rgba +/- src.rgba).*/
+      frag_color = color * color.a * opacity;
+      frag_revealage = vec4(0.0);
+      break;
+  }
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/gpencil/shaders/gpencil_layer_blend_frag.glsl b/source/blender/draw/engines/gpencil/shaders/gpencil_layer_blend_frag.glsl
index ed3a6c53b4b..a43f69bee6a 100644
--- a/source/blender/draw/engines/gpencil/shaders/gpencil_layer_blend_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/gpencil_layer_blend_frag.glsl
@@ -11,15 +11,6 @@ in vec4 uvcoordsvar;
 layout(location = 0) out vec4 fragColor;
 layout(location = 1) out vec4 fragRevealage;
 
-/* Must match eGPLayerBlendModes */
-#define MODE_REGULAR 0
-#define MODE_OVERLAY 1
-#define MODE_ADD 2
-#define MODE_SUB 3
-#define MODE_MULTIPLY 4
-#define MODE_DIVIDE 5
-#define MODE_OVERLAY_SECOND_PASS 999
-
 void main()
 {
   vec4 color;
@@ -32,51 +23,5 @@ void main()
   fragColor = vec4(1.0, 0.0, 1.0, 1.0);
   fragRevealage = vec4(1.0, 0.0, 1.0, 1.0);
 
-  switch (blendMode) {
-    case MODE_REGULAR:
-      /* Reminder: Blending func is premult alpha blend (dst.rgba * (1 - src.a) + src.rgb).*/
-      color *= blendOpacity;
-      fragColor = color;
-      fragRevealage = vec4(0.0, 0.0, 0.0, color.a);
-      break;
-    case MODE_MULTIPLY:
-      /* Reminder: Blending func is multiply blend (dst.rgba * src.rgba).*/
-      color.a *= blendOpacity;
-      fragRevealage = fragColor = (1.0 - color.a) + color.a * color;
-      break;
-    case MODE_DIVIDE:
-      /* Reminder: Blending func is multiply blend (dst.rgba * src.rgba).*/
-      color.a *= blendOpacity;
-      fragRevealage = fragColor = clamp(1.0 / (1.0 - color * color.a), 0.0, 1e18);
-      break;
-    case MODE_OVERLAY:
-      /* Reminder: Blending func is multiply blend (dst.rgba * src.rgba).*/
-      /**
-       * We need to separate the overlay equation into 2 term (one mul and one add).
-       * This is the standard overlay equation (per channel):
-       * rtn = (src < 0.5) ? (2.0 * src * dst) : (1.0 - 2.0 * (1.0 - src) * (1.0 - dst));
-       * We rewrite the second branch like this:
-       * rtn = 1 - 2 * (1 - src) * (1 - dst);
-       * rtn = 1 - 2 (1 - dst + src * dst - src);
-       * rtn = 1 - 2 (1 - dst * (1 - src) - src);
-       * rtn = 1 - 2 + dst * (2 - 2 * src) + 2 * src;
-       * rtn = (- 1 + 2 * src) + dst * (2 - 2 * src);
-       **/
-      color = mix(vec4(0.5), color, color.a * blendOpacity);
-      vec4 s = step(-0.5, -color);
-      fragRevealage = fragColor = 2.0 * s + 2.0 * color * (1.0 - s * 2.0);
-      break;
-    case MODE_OVERLAY_SECOND_PASS:
-      /* Reminder: Blending func is additive blend (dst.rgba + src.rgba).*/
-      color = mix(vec4(0.5), color, color.a * blendOpacity);
-      fragRevealage = fragColor = (-1.0 + 2.0 * color) * step(-0.5, -color);
-      break;
-    case MODE_SUB:
-    case MODE_ADD:
-      /* Reminder: Blending func is additive / subtractive blend (dst.rgba +/- src.rgba).*/
-      color *= blendOpacity;
-      fragColor = color * color.a;
-      fragRevealage = vec4(0.0);
-      break;
-  }
+  blend_mode_output(blendMode, color, blendOpacity, fragColor, fragRevealage);
 }



More information about the Bf-blender-cvs mailing list