[Bf-blender-cvs] [4e92ed87ac] blender2.8: Object Mode Outline: Changed algorithm a bit.
Clément Foucault
noreply at git.blender.org
Wed Mar 22 02:19:51 CET 2017
Commit: 4e92ed87ac7350d0818cf79cb0591d671297d91a
Author: Clément Foucault
Date: Wed Mar 22 02:14:23 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB4e92ed87ac7350d0818cf79cb0591d671297d91a
Object Mode Outline: Changed algorithm a bit.
First pass find outline pixel.
Second pass expand it by 1px in each direction.
Subsequent passes fade the occluded outlines inward.
===================================================================
M source/blender/draw/modes/object_mode.c
M source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
M source/blender/draw/modes/shaders/object_outline_expand_frag.glsl
M source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl
===================================================================
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index aee443895b..1ef3737aab 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -54,11 +54,13 @@ typedef struct OBJECT_PassList {
struct DRWPass *non_meshes;
struct DRWPass *ob_center;
struct DRWPass *outlines;
+ struct DRWPass *outlines_search;
struct DRWPass *outlines_expand;
- struct DRWPass *outlines_blur1;
- struct DRWPass *outlines_blur2;
- struct DRWPass *outlines_blur3;
- struct DRWPass *outlines_blur4;
+ struct DRWPass *outlines_fade1;
+ struct DRWPass *outlines_fade2;
+ struct DRWPass *outlines_fade3;
+ struct DRWPass *outlines_fade4;
+ struct DRWPass *outlines_fade5;
struct DRWPass *outlines_resolve;
struct DRWPass *bone_solid;
struct DRWPass *bone_wire;
@@ -149,7 +151,7 @@ static struct {
static struct {
struct GPUShader *outline_resolve_sh;
- struct GPUShader *outline_expand_sh;
+ struct GPUShader *outline_detect_sh;
struct GPUShader *outline_fade_sh;
} e_data = {NULL}; /* Engine data */
@@ -178,8 +180,8 @@ static void OBJECT_engine_init(void)
e_data.outline_resolve_sh = DRW_shader_create_fullscreen(datatoc_object_outline_resolve_frag_glsl, NULL);
}
- if (!e_data.outline_expand_sh) {
- e_data.outline_expand_sh = DRW_shader_create_fullscreen(datatoc_object_outline_detect_frag_glsl, NULL);
+ if (!e_data.outline_detect_sh) {
+ e_data.outline_detect_sh = DRW_shader_create_fullscreen(datatoc_object_outline_detect_frag_glsl, NULL);
}
if (!e_data.outline_fade_sh) {
@@ -191,8 +193,8 @@ static void OBJECT_engine_free(void)
{
if (e_data.outline_resolve_sh)
DRW_shader_free(e_data.outline_resolve_sh);
- if (e_data.outline_expand_sh)
- DRW_shader_free(e_data.outline_expand_sh);
+ if (e_data.outline_detect_sh)
+ DRW_shader_free(e_data.outline_detect_sh);
if (e_data.outline_fade_sh)
DRW_shader_free(e_data.outline_fade_sh);
}
@@ -233,46 +235,79 @@ static void OBJECT_cache_init(void)
{
DRWState state = DRW_STATE_WRITE_COLOR;
- psl->outlines_expand = DRW_pass_create("Outlines Expand Pass", state);
-
struct Batch *quad = DRW_cache_fullscreen_quad_get();
static float alphaOcclu = 0.35f;
- static float alphaNear = 0.75f;
- static float alphaFar = 0.5f;
+ static float one = 1.0f;
+ static float alpha1 = 5.0f / 6.0f;
+ static float alpha2 = 4.0f / 5.0f;
+ static float alpha3 = 3.0f / 4.0f;
+ static float alpha4 = 2.0f / 3.0f;
+ static float alpha5 = 1.0f / 2.0f;
+ static bool bTrue = true;
+ static bool bFalse = false;
- DRWShadingGroup *grp = DRW_shgroup_create(e_data.outline_expand_sh, psl->outlines_expand);
+ psl->outlines_search = DRW_pass_create("Outlines Expand Pass", state);
+
+ DRWShadingGroup *grp = DRW_shgroup_create(e_data.outline_detect_sh, psl->outlines_search);
DRW_shgroup_uniform_buffer(grp, "outlineColor", &txl->outlines_color_tx, 0);
DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
DRW_shgroup_uniform_buffer(grp, "sceneDepth", &dtxl->depth, 2);
DRW_shgroup_uniform_float(grp, "alphaOcclu", &alphaOcclu, 1);
+ DRW_shgroup_uniform_vec2(grp, "viewportSize", DRW_viewport_size_get(), 1);
DRW_shgroup_call_add(grp, quad, NULL);
- psl->outlines_blur1 = DRW_pass_create("Outlines Blur 1 Pass", state);
+ psl->outlines_expand = DRW_pass_create("Outlines Expand Pass", state);
- grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_blur1);
+ grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_expand);
DRW_shgroup_uniform_buffer(grp, "outlineColor", &txl->outlines_blur_tx, 0);
- DRW_shgroup_uniform_float(grp, "alpha", &alphaNear, 1);
+ DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
+ DRW_shgroup_uniform_float(grp, "alpha", &one, 1);
+ DRW_shgroup_uniform_bool(grp, "doExpand", &bTrue, 1);
DRW_shgroup_call_add(grp, quad, NULL);
- psl->outlines_blur2 = DRW_pass_create("Outlines Blur 2 Pass", state);
+ psl->outlines_fade1 = DRW_pass_create("Outlines Fade 1 Pass", state);
- grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_blur2);
+ grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_fade1);
DRW_shgroup_uniform_buffer(grp, "outlineColor", &txl->outlines_color_tx, 0);
- DRW_shgroup_uniform_float(grp, "alpha", &alphaNear, 1);
+ DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
+ DRW_shgroup_uniform_float(grp, "alpha", &alpha1, 1);
+ DRW_shgroup_uniform_bool(grp, "doExpand", &bFalse, 1);
DRW_shgroup_call_add(grp, quad, NULL);
- psl->outlines_blur3 = DRW_pass_create("Outlines Blur 3 Pass", state);
+ psl->outlines_fade2 = DRW_pass_create("Outlines Fade 2 Pass", state);
- grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_blur3);
+ grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_fade2);
DRW_shgroup_uniform_buffer(grp, "outlineColor", &txl->outlines_blur_tx, 0);
- DRW_shgroup_uniform_float(grp, "alpha", &alphaFar, 1);
+ DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
+ DRW_shgroup_uniform_float(grp, "alpha", &alpha2, 1);
+ DRW_shgroup_uniform_bool(grp, "doExpand", &bFalse, 1);
DRW_shgroup_call_add(grp, quad, NULL);
- psl->outlines_blur4 = DRW_pass_create("Outlines Blur 4 Pass", state);
+ psl->outlines_fade3 = DRW_pass_create("Outlines Fade 3 Pass", state);
- grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_blur4);
+ grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_fade3);
DRW_shgroup_uniform_buffer(grp, "outlineColor", &txl->outlines_color_tx, 0);
- DRW_shgroup_uniform_float(grp, "alpha", &alphaFar, 1);
+ DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
+ DRW_shgroup_uniform_float(grp, "alpha", &alpha3, 1);
+ DRW_shgroup_uniform_bool(grp, "doExpand", &bFalse, 1);
+ DRW_shgroup_call_add(grp, quad, NULL);
+
+ psl->outlines_fade4 = DRW_pass_create("Outlines Fade 4 Pass", state);
+
+ grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_fade4);
+ DRW_shgroup_uniform_buffer(grp, "outlineColor", &txl->outlines_blur_tx, 0);
+ DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
+ DRW_shgroup_uniform_float(grp, "alpha", &alpha4, 1);
+ DRW_shgroup_uniform_bool(grp, "doExpand", &bFalse, 1);
+ DRW_shgroup_call_add(grp, quad, NULL);
+
+ psl->outlines_fade5 = DRW_pass_create("Outlines Fade 5 Pass", state);
+
+ grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_fade5);
+ DRW_shgroup_uniform_buffer(grp, "outlineColor", &txl->outlines_color_tx, 0);
+ DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
+ DRW_shgroup_uniform_float(grp, "alpha", &alpha5, 1);
+ DRW_shgroup_uniform_bool(grp, "doExpand", &bFalse, 1);
DRW_shgroup_call_add(grp, quad, NULL);
}
@@ -284,7 +319,6 @@ static void OBJECT_cache_init(void)
DRWShadingGroup *grp = DRW_shgroup_create(e_data.outline_resolve_sh, psl->outlines_resolve);
DRW_shgroup_uniform_buffer(grp, "outlineBluredColor", &txl->outlines_blur_tx, 0);
- DRW_shgroup_uniform_buffer(grp, "outlineDepth", &txl->outlines_depth_tx, 1);
DRW_shgroup_call_add(grp, quad, NULL);
}
@@ -743,39 +777,53 @@ static void OBJECT_draw_scene(void)
OBJECT_Data *ved = DRW_viewport_engine_data_get("ObjectMode");
OBJECT_PassList *psl = ved->psl;
OBJECT_FramebufferList *fbl = ved->fbl;
+ OBJECT_TextureList *txl = ved->txl;
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
float clearcol[4] = {0.0f, 0.0f, 0.0f, 0.0f};
- DRW_draw_pass(psl->bone_wire);
- DRW_draw_pass(psl->bone_solid);
- DRW_draw_pass(psl->non_meshes);
- DRW_draw_pass(psl->ob_center);
-
/* Render filled polygon on a separate framebuffer */
DRW_framebuffer_bind(fbl->outlines);
DRW_framebuffer_clear(true, true, false, clearcol, 1.0f);
DRW_draw_pass(psl->outlines);
- /* Expand filled color by 1px and modulate if occluded */
+ /* detach textures */
+ DRW_framebuffer_texture_detach(txl->outlines_depth_tx);
+
+ /* Search outline pixels */
DRW_framebuffer_bind(fbl->blur);
- DRW_draw_pass(psl->outlines_expand);
+ DRW_draw_pass(psl->outlines_search);
/* Expand and fade gradually */
DRW_framebuffer_bind(fbl->outlines);
- DRW_draw_pass(psl->outlines_blur1);
+ DRW_draw_pass(psl->outlines_expand);
+
+ DRW_framebuffer_bind(fbl->blur);
+ DRW_draw_pass(psl->outlines_fade1);
+
+ DRW_framebuffer_bind(fbl->outlines);
+ DRW_draw_pass(psl->outlines_fade2);
DRW_framebuffer_bind(fbl->blur);
- DRW_draw_pass(psl->outlines_blur2);
+ DRW_draw_pass(psl->outlines_fade3);
- // DRW_framebuffer_bind(fbl->outlines);
- // DRW_draw_pass(psl->outlines_blur3);
+ DRW_framebuffer_bind(fbl->outlines);
+ DRW_draw_pass(psl->outlines_fade4);
+
+ DRW_framebuffer_bind(fbl->blur);
+ DRW_draw_pass(psl->outlines_fade5);
- // DRW_framebuffer_bind(fbl->blur);
- // DRW_draw_pass(psl->outlines_blur4);
+ /* reattach */
+ DRW_framebuffer_texture_attach(fbl->outlines, txl->outlines_depth_tx, 0);
/* Combine with scene buffer */
DRW_framebuffer_bind(dfbl->default_fb);
DRW_draw_pass(psl->outlines_resolve);
+
+ /* This needs to be drawn after the oultine */
+ DRW_draw_pass(psl->bone_wire);
+ DRW_draw_pass(psl->bone_solid);
+ DRW_draw_pass(psl->non_meshes);
+ DRW_draw_pass(psl->ob_center);
}
void OBJECT_collection_settings_create(CollectionEngineSettings *ces)
diff --git a/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl b/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
index fc40a7dd1d..0d6173cf4f 100644
--- a/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
@@ -8,14 +8,24 @@ uniform sampler2D outlineDepth;
uniform sampler2D sceneDepth;
uniform float alphaOcclu;
+uniform vec2 viewportSize;
-void search_outline(ivec2 uv, ivec2 offset, vec4 ref_col, inout bool outline)
+void search_outline(ivec2 uv, ivec2 offset, vec4 ref_col, inout bool ref_occlu, inout bool outline)
{
if (!outline) {
vec4 color = texelFetchOffset(outlineColor, uv, 0, offset).rgba;
if (color != ref_col) {
outline = true;
}
+ else {
+ float depth = t
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list