Object Outline: trying something new

This commit is contained in:
Clément Foucault 2017-03-21 19:29:58 +01:00
parent 80e6638ad3
commit 7870bde275
4 changed files with 60 additions and 11 deletions

View File

@ -117,6 +117,7 @@ data_to_c_simple(modes/shaders/edit_normals_vert.glsl SRC)
data_to_c_simple(modes/shaders/edit_normals_geom.glsl SRC)
data_to_c_simple(modes/shaders/object_outline_resolve_frag.glsl SRC)
data_to_c_simple(modes/shaders/object_outline_expand_frag.glsl SRC)
data_to_c_simple(modes/shaders/object_outline_detect_frag.glsl SRC)
list(APPEND INC
)

View File

@ -45,6 +45,7 @@
extern GlobalsUboStorage ts;
extern char datatoc_object_outline_resolve_frag_glsl[];
extern char datatoc_object_outline_detect_frag_glsl[];
extern char datatoc_object_outline_expand_frag_glsl[];
/* *********** LISTS *********** */
@ -178,7 +179,7 @@ static void OBJECT_engine_init(void)
}
if (!e_data.outline_expand_sh) {
e_data.outline_expand_sh = DRW_shader_create_fullscreen(datatoc_object_outline_expand_frag_glsl, "#define DEPTH_TEST");
e_data.outline_expand_sh = DRW_shader_create_fullscreen(datatoc_object_outline_detect_frag_glsl, NULL);
}
if (!e_data.outline_fade_sh) {
@ -235,7 +236,7 @@ static void OBJECT_cache_init(void)
psl->outlines_expand = DRW_pass_create("Outlines Expand Pass", state);
struct Batch *quad = DRW_cache_fullscreen_quad_get();
static float one = 1.0f;
static float alphaOcclu = 0.35f;
static float alphaNear = 0.75f;
static float alphaFar = 0.5f;
@ -243,7 +244,7 @@ static void OBJECT_cache_init(void)
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, "alpha", &one, 1);
DRW_shgroup_uniform_float(grp, "alphaOcclu", &alphaOcclu, 1);
DRW_shgroup_call_add(grp, quad, NULL);
psl->outlines_blur1 = DRW_pass_create("Outlines Blur 1 Pass", state);
@ -743,7 +744,6 @@ static void OBJECT_draw_scene(void)
OBJECT_PassList *psl = ved->psl;
OBJECT_FramebufferList *fbl = ved->fbl;
DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
float clearcol[4] = {0.0f, 0.0f, 0.0f, 0.0f};
DRW_draw_pass(psl->bone_wire);
@ -767,11 +767,11 @@ static void OBJECT_draw_scene(void)
DRW_framebuffer_bind(fbl->blur);
DRW_draw_pass(psl->outlines_blur2);
DRW_framebuffer_bind(fbl->outlines);
DRW_draw_pass(psl->outlines_blur3);
// DRW_framebuffer_bind(fbl->outlines);
// DRW_draw_pass(psl->outlines_blur3);
DRW_framebuffer_bind(fbl->blur);
DRW_draw_pass(psl->outlines_blur4);
// DRW_framebuffer_bind(fbl->blur);
// DRW_draw_pass(psl->outlines_blur4);
/* Combine with scene buffer */
DRW_framebuffer_bind(dfbl->default_fb);

View File

@ -0,0 +1,48 @@
in vec4 uvcoordsvar;
out vec4 FragColor;
uniform sampler2D outlineColor;
uniform sampler2D outlineDepth;
uniform sampler2D sceneDepth;
uniform float alphaOcclu;
void search_outline(ivec2 uv, ivec2 offset, vec4 ref_col, inout bool outline)
{
if (!outline) {
vec4 color = texelFetchOffset(outlineColor, uv, 0, offset).rgba;
if (color != ref_col) {
outline = true;
}
}
}
void main()
{
ivec2 uv = ivec2(gl_FragCoord.xy);
vec4 ref_col = texelFetch(outlineColor, uv, 0).rgba;
bool outline = false;
search_outline(uv, ivec2( 1, 0), ref_col, outline);
search_outline(uv, ivec2( 0, 1), ref_col, outline);
search_outline(uv, ivec2(-1, 0), ref_col, outline);
search_outline(uv, ivec2( 0, -1), ref_col, outline);
/* We Hit something ! */
if (outline) {
FragColor = ref_col;
/* Modulate color if occluded */
float depth = texelFetch(outlineDepth, uv, 0).r;
float scene_depth = texelFetch(sceneDepth, uv, 0).r;
/* TODO bias in linear depth not exponential */
if (depth > scene_depth) {
FragColor.a *= alphaOcclu;
}
}
else {
FragColor = vec4(0.0);
}
}

View File

@ -11,7 +11,7 @@ void main()
FragColor = texture(outlineBluredColor, uvcoordsvar.st).rgba;
/* Modulate fill color */
float depth = texture(outlineDepth, uvcoordsvar.st).r;
if (depth != 1.0)
FragColor.a *= 0.1;
// float depth = texture(outlineDepth, uvcoordsvar.st).r;
// if (depth != 1.0)
// FragColor.a *= 0.1;
}