[Bf-blender-cvs] [ac61eb3900c] blender2.8: GP: Fix several issues in blur FX
Antonioya
noreply at git.blender.org
Sun Oct 14 12:21:50 CEST 2018
Commit: ac61eb3900cb8bd0d43846c5ef94ea89cbe9bd9d
Author: Antonioya
Date: Sun Oct 14 12:19:16 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBac61eb3900cb8bd0d43846c5ef94ea89cbe9bd9d
GP: Fix several issues in blur FX
There were some problems with the z-depth and especially when tries to blur a pixel outside the viewport.
===================================================================
M source/blender/draw/engines/gpencil/gpencil_shader_fx.c
M source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
===================================================================
diff --git a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
index 2165fb251dc..ebdb2cf086a 100644
--- a/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
+++ b/source/blender/draw/engines/gpencil/gpencil_shader_fx.c
@@ -218,6 +218,7 @@ static void DRW_gpencil_fx_blur(
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_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
@@ -409,6 +410,7 @@ static void DRW_gpencil_fx_rim(
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
@@ -493,6 +495,7 @@ static void DRW_gpencil_fx_shadow(
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
@@ -551,6 +554,7 @@ static void DRW_gpencil_fx_glow(
DRW_shgroup_call_add(fx_shgrp, fxquad, NULL);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeColor", &e_data->temp_color_tx_fx);
DRW_shgroup_uniform_texture_ref(fx_shgrp, "strokeDepth", &e_data->temp_depth_tx_fx);
+ DRW_shgroup_uniform_vec2(fx_shgrp, "Viewport", DRW_viewport_size_get(), 1);
DRW_shgroup_uniform_int(fx_shgrp, "blur", &fxd->blur[0], 2);
DRW_shgroup_uniform_vec3(fx_shgrp, "loc", &cache->loc[0], 1);
diff --git a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
index c8bc5e1fe91..45f142254d7 100644
--- a/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
+++ b/source/blender/draw/engines/gpencil/shaders/fx/gpencil_fx_blur_frag.glsl
@@ -3,6 +3,7 @@ uniform mat4 ViewMatrix;
uniform sampler2D strokeColor;
uniform sampler2D strokeDepth;
+uniform vec2 Viewport;
uniform int blur[2];
@@ -15,6 +16,20 @@ vec2 noffset = vec2(blur[0], blur[1]);
out vec4 FragColor;
+float get_zdepth(ivec2 poxy)
+{
+ /* if outside viewport set as infinite depth */
+ if ((poxy.x < 0) || (poxy.x > Viewport.x)) {
+ return 1.0f;
+ }
+ if ((poxy.y < 0) || (poxy.y > Viewport.y)) {
+ return 1.0f;
+ }
+
+ float zdepth = texelFetch(strokeDepth, poxy, 0).r;
+ return zdepth;
+}
+
void main()
{
ivec2 uv = ivec2(gl_FragCoord.xy);
@@ -25,19 +40,20 @@ void main()
float dy = (ProjectionMatrix[3][3] == 0.0) ? (noffset[1] / (nloc.z * defaultpixsize)) : (noffset[1] / defaultpixsize);
/* apply blurring, using a 9-tap filter with predefined gaussian weights */
- /* depth (get the minimum value of the surrounding pixels) */
- float outdepth = 0;
- outdepth = texelFetch(strokeDepth, ivec2(uv.x - 1.0 * dx, uv.y + 1.0 * dy), 0).r;
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x - 0.0 * dx, uv.y + 1.0 * dy), 0).r);
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x + 1.0 * dx, uv.y + 1.0 * dy), 0).r);
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x - 1.0 * dx, uv.y + 0.0 * dy), 0).r);
+ /* depth (get the value of the surrounding pixels) */
+ float outdepth = 0.0;
+
+ outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y + 1.0 * dy)) * 0.0947416;
+ outdepth += get_zdepth(ivec2(uv.x - 0.0 * dx, uv.y + 1.0 * dy)) * 0.118318;
+ outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y + 1.0 * dy)) * 0.0947416;
+ outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y + 0.0 * dy)) * 0.118318;
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x, uv.y), 0).r);
+ outdepth += get_zdepth(ivec2(uv.x, uv.y)) * 0.147761;
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x + 1.0 * dx, uv.y + 0.0 * dy), 0).r);
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x - 1.0 * dx, uv.y - 1.0 * dy), 0).r);
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x + 0.0 * dx, uv.y - 1.0 * dy), 0).r);
- outdepth = min(outdepth, texelFetch(strokeDepth, ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy), 0).r);
+ outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y + 0.0 * dy)) * 0.118318;
+ outdepth += get_zdepth(ivec2(uv.x - 1.0 * dx, uv.y - 1.0 * dy)) * 0.0947416;
+ outdepth += get_zdepth(ivec2(uv.x + 0.0 * dx, uv.y - 1.0 * dy)) * 0.118318;
+ outdepth += get_zdepth(ivec2(uv.x + 1.0 * dx, uv.y - 1.0 * dy)) * 0.0947416;
gl_FragDepth = outdepth;
@@ -57,6 +73,11 @@ void main()
FragColor = clamp(outcolor, 0, 1.0);
- if (outcolor.a < 0.02f)
+ /* discar extreme values */
+ if (outcolor.a < 0.02f) {
+ discard;
+ }
+ if ((outdepth <= 0.000001) || (outdepth >= 0.999999)){
discard;
+ }
}
More information about the Bf-blender-cvs
mailing list