[Bf-blender-cvs] [7870bde275] blender2.8: Object Outline: trying something new

Clément Foucault noreply at git.blender.org
Tue Mar 21 19:32:33 CET 2017


Commit: 7870bde275a23b78198dc9d943e8dfe7a05a8b01
Author: Clément Foucault
Date:   Tue Mar 21 19:29:58 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB7870bde275a23b78198dc9d943e8dfe7a05a8b01

Object Outline: trying something new

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/modes/object_mode.c
A	source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
M	source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index ced4aa01e2..f8f1408f94 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -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
 )
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 33ecde5fd7..aee443895b 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -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);
diff --git a/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl b/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
new file mode 100644
index 0000000000..fc40a7dd1d
--- /dev/null
+++ b/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
@@ -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);
+	}
+}
diff --git a/source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl b/source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl
index 9c1ecbbdc9..12f375369b 100644
--- a/source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_outline_resolve_frag.glsl
@@ -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;
 }




More information about the Bf-blender-cvs mailing list