[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