[Bf-blender-cvs] [26d0530d03a] temp-greasepencil-vfx: New Colorize Shader effect

Antonio Vazquez noreply at git.blender.org
Sun Jul 1 18:24:41 CEST 2018


Commit: 26d0530d03a5a3d593293376eebb738933b04159
Author: Antonio Vazquez
Date:   Sun Jul 1 17:21:46 2018 +0200
Branches: temp-greasepencil-vfx
https://developer.blender.org/rB26d0530d03a5a3d593293376eebb738933b04159

New Colorize Shader effect

This effects is used to convert to GrayScale, Sepia, BW and other color changes.

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

M	release/scripts/startup/bl_ui/properties_data_shaderfx.py
M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/gpencil/gpencil_shader_fx.c
A	source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl
M	source/blender/makesdna/DNA_shader_fx_types.h
M	source/blender/makesrna/RNA_access.h
M	source/blender/makesrna/intern/rna_shader_fx.c
M	source/blender/shader_fx/CMakeLists.txt
M	source/blender/shader_fx/FX_shader_types.h
A	source/blender/shader_fx/intern/FX_shader_colorize.c
M	source/blender/shader_fx/intern/FX_shader_util.c

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

diff --git a/release/scripts/startup/bl_ui/properties_data_shaderfx.py b/release/scripts/startup/bl_ui/properties_data_shaderfx.py
index 6f2cab5239d..1cb940d39cc 100644
--- a/release/scripts/startup/bl_ui/properties_data_shaderfx.py
+++ b/release/scripts/startup/bl_ui/properties_data_shaderfx.py
@@ -65,6 +65,20 @@ class DATA_PT_shader_fx(ShaderFxButtonsPanel, Panel):
         if fx.use_dof_mode:
             layout.prop(fx, "coc")
 
+    def FX_COLORIZE(self, layout, fx):
+        layout.prop(fx, "mode", text="Mode")
+
+        if fx.mode == 'BITONE':
+            layout.prop(fx, "low_color", text="Low Color")
+        if fx.mode == 'CUSTOM':
+            layout.prop(fx, "low_color", text="Color")
+
+        if fx.mode == 'BITONE':
+            layout.prop(fx, "high_color", text="High Color")
+
+        if fx.mode in {'BITONE', 'CUSTOM'}:
+            layout.prop(fx, "factor")
+
     def FX_WAVE(self, layout,fx):
         layout.prop(fx, "orientation", expand=True)
 
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index b4c147a3bdd..6343a8825f3 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -320,6 +320,7 @@ data_to_c_simple(engines/gpencil/shaders/gpencil_edit_point_geom.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_edit_point_frag.glsl SRC)
 
 data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_flip_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_light_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/fx/gpencil_fx_pixel_frag.glsl SRC)
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 2967cd1f8de..766a555b255 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -77,6 +77,13 @@ typedef struct GPencilFXBlur {
 	int samples;
 } GPencilFXBlur;
 
+typedef struct GPencilFXColorize {
+	float low_color[4];
+	float high_color[4];
+	int mode;
+	float factor;
+} GPencilFXColorize;
+
 typedef struct GPencilFXFlip {
 	float flipmode[2]; /* use float to pass to shader, but only will be 0 or 1 */
 } GPencilFXFlip;
@@ -111,6 +118,7 @@ typedef struct tGPencilObjectCache {
 	/* effects */
 	DRWShadingGroup *fx_wave_sh;
 	DRWShadingGroup *fx_blur_sh;
+	DRWShadingGroup *fx_colorize_sh;
 	DRWShadingGroup *fx_pixel_sh;
 	DRWShadingGroup *fx_rim_sh;
 	DRWShadingGroup *fx_swirl_sh;
@@ -124,6 +132,7 @@ typedef struct tGPencilObjectCache {
   /* *********** LISTS *********** */
 typedef struct GPENCIL_fx {
 	GPencilFXBlur fx_blur;
+	GPencilFXColorize fx_colorize;
 	GPencilFXWave fx_wave;
 	GPencilFXPixel fx_pixel;
 	GPencilFXRim fx_rim;
@@ -199,6 +208,7 @@ typedef struct GPENCIL_PassList {
 
 	/* effects */
 	struct DRWPass *fx_blur_pass;
+	struct DRWPass *fx_colorize_pass;
 	struct DRWPass *fx_flip_pass;
 	struct DRWPass *fx_light_pass;
 	struct DRWPass *fx_pixel_pass;
@@ -281,6 +291,7 @@ typedef struct GPENCIL_e_data {
 
 	/* effects */
 	struct GPUShader *gpencil_fx_blur_sh;
+	struct GPUShader *gpencil_fx_colorize_sh;
 	struct GPUShader *gpencil_fx_flip_sh;
 	struct GPUShader *gpencil_fx_light_sh;
 	struct GPUShader *gpencil_fx_pixel_sh;
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index 735e4ddfe72..e1518deb69f 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -42,6 +42,7 @@
 #include "gpencil_engine.h"
 
 extern char datatoc_gpencil_fx_blur_frag_glsl[];
+extern char datatoc_gpencil_fx_colorize_frag_glsl[];
 extern char datatoc_gpencil_fx_flip_frag_glsl[];
 extern char datatoc_gpencil_fx_light_frag_glsl[];
 extern char datatoc_gpencil_fx_pixel_frag_glsl[];
@@ -215,6 +216,40 @@ static void DRW_gpencil_fx_blur(
 	cache->fx_blur_sh = fx_shgrp;
 }
 
+/* Colorize FX */
+static void DRW_gpencil_fx_colorize(
+	ShaderFxData *fx, int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
+	tGPencilObjectCache *cache)
+{
+	if (fx == NULL) {
+		return;
+	}
+	Object *ob = cache->ob;
+	ColorizeShaderFxData *fxd = (ColorizeShaderFxData *)fx;
+
+	GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+	GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
+	DRWShadingGroup *fx_shgrp;
+	bGPdata *gpd = (bGPdata *)ob->data;
+
+	copy_v4_v4(stl->fx[ob_idx].fx_colorize.low_color, fxd->low_color);
+	copy_v4_v4(stl->fx[ob_idx].fx_colorize.high_color, fxd->high_color);
+	stl->fx[ob_idx].fx_colorize.mode = fxd->mode;
+	stl->fx[ob_idx].fx_colorize.factor = fxd->factor;
+
+	struct Gwn_Batch *fxquad = DRW_cache_fullscreen_quad_get();
+	fx_shgrp = DRW_shgroup_create(e_data->gpencil_fx_colorize_sh, psl->fx_colorize_pass);
+	DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
+	DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_a);
+	DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_a);
+	DRW_shgroup_uniform_vec4(fx_shgrp, "low_color", &stl->fx[ob_idx].fx_colorize.low_color[0], 1);
+	DRW_shgroup_uniform_vec4(fx_shgrp, "high_color", &stl->fx[ob_idx].fx_colorize.high_color[0], 1);
+	DRW_shgroup_uniform_int(fx_shgrp, "mode", &stl->fx[ob_idx].fx_colorize.mode, 1);
+	DRW_shgroup_uniform_float(fx_shgrp, "factor", &stl->fx[ob_idx].fx_colorize.factor, 1);
+
+	cache->fx_colorize_sh = fx_shgrp;
+}
+
 /* Flip FX */
 static void DRW_gpencil_fx_flip(
 	ShaderFxData *fx, int ob_idx, GPENCIL_e_data *e_data, GPENCIL_Data *vedata,
@@ -477,6 +512,9 @@ void GPENCIL_create_fx_shaders(GPENCIL_e_data *e_data)
 	if (!e_data->gpencil_fx_blur_sh) {
 		e_data->gpencil_fx_blur_sh = DRW_shader_create_fullscreen(datatoc_gpencil_fx_blur_frag_glsl, NULL);
 	}
+	if (!e_data->gpencil_fx_colorize_sh) {
+		e_data->gpencil_fx_colorize_sh = DRW_shader_create_fullscreen(datatoc_gpencil_fx_colorize_frag_glsl, NULL);
+	}
 	if (!e_data->gpencil_fx_flip_sh) {
 		e_data->gpencil_fx_flip_sh = DRW_shader_create_fullscreen(datatoc_gpencil_fx_flip_frag_glsl, NULL);
 	}
@@ -501,6 +539,7 @@ void GPENCIL_create_fx_shaders(GPENCIL_e_data *e_data)
 void GPENCIL_delete_fx_shaders(GPENCIL_e_data *e_data)
 {
 	DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_blur_sh);
+	DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_colorize_sh);
 	DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_flip_sh);
 	DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_light_sh);
 	DRW_SHADER_FREE_SAFE(e_data->gpencil_fx_pixel_sh);
@@ -517,6 +556,8 @@ void GPENCIL_create_fx_passes(GPENCIL_PassList *psl)
 	/* FX passes */
 	psl->fx_blur_pass = DRW_pass_create("GPencil FX Blur Pass", state);
 
+	psl->fx_colorize_pass = DRW_pass_create("GPencil FX Colorize Pass", state);
+
 	psl->fx_flip_pass = DRW_pass_create("GPencil FX Flip Pass", state);
 
 	psl->fx_light_pass = DRW_pass_create("GPencil FX Light Pass", state);
@@ -550,6 +591,9 @@ void DRW_gpencil_fx_prepare(
 				case eShaderFxType_Blur:
 					DRW_gpencil_fx_blur(fx, ob_idx, e_data, vedata, cache);
 					break;
+				case eShaderFxType_Colorize:
+					DRW_gpencil_fx_colorize(fx, ob_idx, e_data, vedata, cache);
+					break;
 				case eShaderFxType_Flip:
 					DRW_gpencil_fx_flip(fx, ob_idx, e_data, vedata, cache);
 					break;
@@ -658,6 +702,13 @@ void DRW_gpencil_fx_draw(struct GPENCIL_e_data *e_data,
 						gpencil_blur_passes(e_data, vedata, cache);
 					}
 					break;
+				case eShaderFxType_Colorize:
+					if (cache->fx_colorize_sh) {
+						gpencil_draw_fx_pass(e_data, psl->fx_colorize_pass,
+							psl->mix_pass_noblend,
+							fbl, cache->fx_colorize_sh);
+					}
+					break;
 				case eShaderFxType_Flip:
 					if (cache->fx_flip_sh) {
 						gpencil_draw_fx_pass(e_data, psl->fx_flip_pass,
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl
new file mode 100644
index 00000000000..c5ac710de1e
--- /dev/null
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_colorize_frag.glsl
@@ -0,0 +1,80 @@
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+
+uniform vec4 low_color;
+uniform vec4 high_color;
+uniform int mode;
+uniform float factor;
+
+out vec4 FragColor;
+
+#define MODE_GRAYSCALE   0
+#define MODE_SEPIA       1
+#define MODE_BITONE      2
+#define MODE_CUSTOM      3
+
+float get_luminance(vec4 color)
+{
+	float lum = (color.r * 0.2126) + (color.g * 0.7152) + (color.b * 0.723);
+	return lum;
+}
+
+void main()
+{
+	ivec2 uv = ivec2(gl_FragCoord.xy);
+
+	float stroke_depth = texelFetch(strokeDepth, uv.xy, 0).r;
+	vec4 src_pixel= texelFetch(strokeColor, uv.xy, 0);
+	float luminance = get_luminance(src_pixel);
+	vec4 outcolor;
+	
+	/* is transparent */ 
+	if (src_pixel.a == 0.0f) {
+		discard;
+	}
+	
+	switch(mode) {
+		case MODE_GRAYSCALE:
+			{
+			outcolor = vec4(luminance, luminance, luminance, src_pixel.a);
+			break;
+			}
+		case MODE_SEPIA:
+			{
+			float Red = (src_pixel.r * 0.393) + (src_pixel.g * 0.769) + (src_pixel.b * 0.189);
+			float Green = (src_pixel.r * 0.349) + (src_pixel.g * 0.686) + (src_pixel.b * 0.168);
+			float Blue = (src_pixel.r * 0.272) + (src_pixel.g * 0.534) + (src_pixel.b * 0.131);
+			outcolor = vec4(Red, Green, Blue, src_pixel.a);
+			break;
+			}
+		case MODE_BITONE:
+			{
+			if (luminance <= factor) {
+				outcolor = low_color;
+			}
+			else {
+				outcolor = high_color;
+			}
+			break;
+			}
+		case MODE_CUSTOM:
+			{
+			/* if below umbral, force custom color */
+			if (luminance <= factor) {
+				outcolor = low_color;
+			}
+			else {
+				outcolor = vec4(luminance * low_color.r, luminance * low_color.b, luminance * low_color.b, src_pixel.a);
+			}
+			break;
+			}
+		default:
+			{
+			outcolor = src_pixel;
+			}
+	
+	}
+
+	gl_FragDepth = stroke_depth;
+	FragColor = outcolor;
+}
diff --git a/source/blender/makesdna/DNA_shader_fx_types.h b/source/blender/makesdna/DNA_shader_fx_types.h
index ef57569a8d7..483f0250542 100644
--- a/source/blender/makesdna/DNA_shader_fx_types.h
+++ b/source/blender/makesdna/DNA_shader_fx_types.h
@@ -

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list