Commit: 24ceb20f545138137324f841370c979ac2727832
Author: Antonio Vazquez
Date:   Sat Aug 5 17:04:57 2017 +0200
Branches: greasepencil-object
https://developer.blender.org/rB24ceb20f545138137324f841370c979ac2727832

WIP: Basic shader for gaussian blur

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

M       source/blender/draw/CMakeLists.txt
M       source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
M       source/blender/draw/engines/gpencil/gpencil_engine.c
M       source/blender/draw/engines/gpencil/gpencil_engine.h
A       
source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt 
b/source/blender/draw/CMakeLists.txt
index b1ec5e91504..d27ac5b7947 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -211,6 +211,7 @@ 
data_to_c_simple(engines/gpencil/shaders/gpencil_zdepth_mix_frag.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_point_vert.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_point_geom.glsl SRC)
 data_to_c_simple(engines/gpencil/shaders/gpencil_point_frag.glsl SRC)
+data_to_c_simple(engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl SRC)
 
 list(APPEND INC
 )
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c 
b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 71478b1b947..9b2aa0ed935 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -79,6 +79,8 @@ void gpencil_object_cache_add(tGPencilObjectCache *cache, 
Object *ob, int *gp_ca
        cache[*gp_cache_used].ob = ob;
        cache[*gp_cache_used].init_grp = 0;
        cache[*gp_cache_used].end_grp = -1;
+       cache[*gp_cache_used].init_vfx_sh = NULL;
+       cache[*gp_cache_used].end_vfx_sh = NULL;
 
        /* calculate zdepth from point of view */
        float zdepth = 0.0;
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c 
b/source/blender/draw/engines/gpencil/gpencil_engine.c
index 7557d5da1dd..a3589f2b867 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -45,6 +45,7 @@ extern char datatoc_gpencil_zdepth_mix_frag_glsl[];
 extern char datatoc_gpencil_point_vert_glsl[];
 extern char datatoc_gpencil_point_geom_glsl[];
 extern char datatoc_gpencil_point_frag_glsl[];
+extern char datatoc_gpencil_gaussian_blur_frag_glsl[];
 
 /* *********** STATIC *********** */
 static GPENCIL_e_data e_data = {NULL}; /* Engine data */
@@ -109,6 +110,8 @@ static void GPENCIL_engine_init(void *vedata)
        }
 
        unit_m4(stl->storage->unit_matrix);
+       ARRAY_SET_ITEMS(stl->storage->blur1, 1.0f, 0.0f); /* horz */
+       ARRAY_SET_ITEMS(stl->storage->blur2, 0.0f, 1.0f); /* vert */
 
        /* blank texture used if no texture defined for fill shader */
        if (!e_data.gpencil_blank_texture) {
@@ -124,6 +127,8 @@ static void GPENCIL_engine_free(void)
        DRW_SHADER_FREE_SAFE(e_data.gpencil_stroke_sh);
        DRW_SHADER_FREE_SAFE(e_data.gpencil_point_sh);
        DRW_SHADER_FREE_SAFE(e_data.gpencil_fullscreen_sh);
+       DRW_SHADER_FREE_SAFE(e_data.gpencil_vfx_blur_sh);
+
        DRW_TEXTURE_FREE_SAFE(e_data.gpencil_blank_texture);
 }
 
@@ -160,6 +165,9 @@ static void GPENCIL_cache_init(void *vedata)
        if (!e_data.gpencil_fullscreen_sh) {
                e_data.gpencil_fullscreen_sh = 
DRW_shader_create_fullscreen(datatoc_gpencil_zdepth_mix_frag_glsl, NULL);
        }
+       if (!e_data.gpencil_vfx_blur_sh) {
+               e_data.gpencil_vfx_blur_sh = 
DRW_shader_create_fullscreen(datatoc_gpencil_gaussian_blur_frag_glsl, NULL);
+       }
 
        {
                /* Stroke pass */
@@ -211,15 +219,20 @@ static void GPENCIL_cache_init(void *vedata)
                DRW_shgroup_call_add(mix_shgrp, quad, NULL);
                DRW_shgroup_uniform_buffer(mix_shgrp, "strokeColor", 
&e_data.temp_fbcolor_color_tx);
                DRW_shgroup_uniform_buffer(mix_shgrp, "strokeDepth", 
&e_data.temp_fbcolor_depth_tx);
+
+               /* VFX pass */
+               psl->vfx_pass = DRW_pass_create("GPencil VFX Pass", 
DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND | DRW_STATE_WRITE_DEPTH | 
DRW_STATE_DEPTH_LESS);
        }
 }
 
 static void GPENCIL_cache_populate(void *vedata, Object *ob)
 {
        GPENCIL_StorageList *stl = ((GPENCIL_Data *)vedata)->stl;
+       GPENCIL_PassList *psl = ((GPENCIL_Data *)vedata)->psl;
        const DRWContextState *draw_ctx = DRW_context_state_get();
        Scene *scene = draw_ctx->scene;
        ToolSettings *ts = scene->toolsettings;
+       tGPencilObjectCache *cache;
 
        /* object datablock (this is not draw now) */
        if (ob->type == OB_GPENCIL && ob->gpd) {
@@ -234,6 +247,26 @@ static void GPENCIL_cache_populate(void *vedata, Object 
*ob)
                gpencil_array_modifiers(stl, ob);
                /* draw current painting strokes */
                DRW_gpencil_populate_buffer_strokes(vedata, ts, ob->gpd);
+
+               /* VFX pass */
+               struct Gwn_Batch *vfxquad = DRW_cache_fullscreen_quad_get();
+               cache = 
&stl->g_data->gp_object_cache[stl->g_data->gp_cache_used - 1];
+
+               /* horizontal blur */
+               DRWShadingGroup *vfx_shgrp = 
DRW_shgroup_create(e_data.gpencil_vfx_blur_sh, psl->vfx_pass);
+               DRW_shgroup_call_add(vfx_shgrp, vfxquad, NULL);
+               DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeColor", 
&e_data.temp_fbcolor_color_tx);
+               DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeDepth", 
&e_data.temp_fbcolor_depth_tx);
+               DRW_shgroup_uniform_vec2(vfx_shgrp, "dir", stl->storage->blur1, 
1);
+               cache->init_vfx_sh = vfx_shgrp;
+
+               /* vertical blur */
+               vfx_shgrp = DRW_shgroup_create(e_data.gpencil_vfx_blur_sh, 
psl->vfx_pass);
+               DRW_shgroup_call_add(vfx_shgrp, vfxquad, NULL);
+               DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeColor", 
&e_data.temp_fbcolor_color_tx);
+               DRW_shgroup_uniform_buffer(vfx_shgrp, "strokeDepth", 
&e_data.temp_fbcolor_depth_tx);
+               DRW_shgroup_uniform_vec2(vfx_shgrp, "dir", stl->storage->blur2, 
1);
+               cache->end_vfx_sh = vfx_shgrp;
        }
 }
 
@@ -284,6 +317,7 @@ static void GPENCIL_draw_scene(void *vedata)
        DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
        float clearcol[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
        int init_grp, end_grp;
+       tGPencilObjectCache *cache;
 
        /* attach temp textures */
        DRW_framebuffer_texture_attach(fbl->temp_color_fb, 
e_data.temp_fbcolor_depth_tx, 0, 0);
@@ -297,9 +331,10 @@ static void GPENCIL_draw_scene(void *vedata)
                        sizeof(tGPencilObjectCache), 
gpencil_object_cache_compare_zdepth);
 
                for (int i = 0; i < stl->g_data->gp_cache_used; ++i) {
-                       Object *ob = stl->g_data->gp_object_cache[i].ob;
-                       init_grp = stl->g_data->gp_object_cache[i].init_grp;
-                       end_grp = stl->g_data->gp_object_cache[i].end_grp;
+                       cache = &stl->g_data->gp_object_cache[i];
+                       Object *ob = cache->ob;
+                       init_grp = cache->init_grp;
+                       end_grp = cache->end_grp;
                        /* Render stroke in separated framebuffer */
                        DRW_framebuffer_bind(fbl->temp_color_fb);
                        DRW_framebuffer_clear(true, true, false, clearcol, 
1.0f);
@@ -321,6 +356,12 @@ static void GPENCIL_draw_scene(void *vedata)
                                DRW_draw_pass(psl->drawing_pass);
                        }
 
+                       /* vfx pass */
+                       if ((cache->init_vfx_sh) && (cache->init_vfx_sh)) {
+                               DRW_draw_pass_subset(psl->vfx_pass,
+                                       cache->init_vfx_sh,
+                                       cache->end_vfx_sh);
+                       }
                        /* Combine with scene buffer */
                        DRW_framebuffer_bind(dfbl->default_fb);
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h 
b/source/blender/draw/engines/gpencil/gpencil_engine.h
index ff09c6edcff..a5dd73f2f14 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -46,6 +46,8 @@ struct GPENCIL_StorageList;
 typedef struct tGPencilObjectCache {
        struct Object *ob;
        int init_grp, end_grp;
+       DRWShadingGroup *init_vfx_sh;
+       DRWShadingGroup *end_vfx_sh;
        float zdepth;
 } tGPencilObjectCache;
 
@@ -72,6 +74,7 @@ typedef struct GPENCIL_Storage {
        int xray;
        int keep_size;
        float obj_scale;
+       float blur1[2], blur2[2];
 } GPENCIL_Storage;
 
 typedef struct GPENCIL_StorageList {
@@ -85,6 +88,7 @@ typedef struct GPENCIL_PassList {
        struct DRWPass *edit_pass;
        struct DRWPass *drawing_pass;
        struct DRWPass *mix_pass;
+       struct DRWPass *vfx_pass;
 } GPENCIL_PassList;
 
 typedef struct GPENCIL_FramebufferList {
@@ -128,6 +132,7 @@ typedef struct GPENCIL_e_data {
        struct GPUShader *gpencil_line_sh;
        struct GPUShader *gpencil_drawing_fill_sh;
        struct GPUShader *gpencil_fullscreen_sh;
+       struct GPUShader *gpencil_vfx_blur_sh;
        /* temp depth texture */
        struct GPUTexture *temp_fbcolor_depth_tx;
        struct GPUTexture *temp_fbcolor_color_tx;
diff --git 
a/source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl 
b/source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl
new file mode 100644
index 00000000000..f65a04ddd4a
--- /dev/null
+++ 
b/source/blender/draw/engines/gpencil/shaders/gpencil_gaussian_blur_frag.glsl
@@ -0,0 +1,36 @@
+
+out vec4 FragColor;
+
+uniform sampler2D strokeColor;
+uniform sampler2D strokeDepth;
+
+/* next 2 fields must be uniforms, now, valuer are only for testing */
+float resolution = 100.0;
+float radius = 300.0;
+uniform vec2 dir;
+
+void main()
+{
+       ivec2 uv = ivec2(gl_FragCoord.xy);
+       float stroke_depth = texelFetch(strokeDepth, uv, 0).r;
+       gl_FragDepth = stroke_depth;
+
+       float blur = radius/resolution; 
+       float hstep = dir.x;
+    float vstep = dir.y;
+       vec4 outcolor = vec4(0.0);
+       /* apply blurring, using a 9-tap filter with predefined gaussian 
weights (base on code written by Matt DesLauriers)*/
+    outcolor += texelFetch(strokeColor, ivec2(uv.x - 4.0 * blur * hstep, uv.y 
- 4.0 * blur * vstep), 0) * 0.0162162162;
+    outcolor += texelFetch(strokeColor, ivec2(uv.x - 3.0 * blur * hstep, uv.y 
- 3.0 * blur * vstep), 0) * 0.0540540541;
+    outcolor += texelFetch(strokeColor, ivec2(uv.x - 2.0 * blur * hstep, uv.y 
- 2.0 * blur * vstep), 0) * 0.1216216216;
+    outcolor += texelFetch(strokeColor, ivec2(uv.x - 1.0 * blur * hstep, uv.y 
- 1.0 * blur * vstep), 0) * 0.1945945946;
+
+    outcolor += texelFetch(strokeColor, ivec2(uv.x, uv.y), 0) * 0.2270270270;
+
+    outcolor += texelFetch(strokeColor, ivec2(uv.x + 1.0 * blur * hstep, uv.y 
+ 1.0 * blur * vstep), 0) * 0.1945945946;
+    outcolor += texelFetch(strokeColor, ivec2(uv.x + 2.0 * blur * hstep, uv.y 
+ 2.0 * blur * vstep), 0) * 0.1216216216;
+    outcolor += texelFetch(strokeColor, ivec2(uv.x + 3.0 * blur * hstep, uv.y 
+ 3.0 * blur * vstep), 0) * 0.0540540541;
+    outcolor += texelFetch(strokeColor, ivec2(uv.x + 4.0 * blur * hstep, uv.y 
+ 4.0 * blur * vstep), 0) * 0.0162162162;
+
+       FragColor = outcolor;
+}

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to