[Bf-blender-cvs] [10ce4719d44] blender2.8: Object Mode: Outlines: Make outline thinner.

Clément Foucault noreply at git.blender.org
Wed Apr 18 11:34:58 CEST 2018


Commit: 10ce4719d441616e06b2e94d374b510413b11b10
Author: Clément Foucault
Date:   Wed Apr 18 11:34:46 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB10ce4719d441616e06b2e94d374b510413b11b10

Object Mode: Outlines: Make outline thinner.

This is by default. We can still enable the thicker outlines for high dpi
screens or personnal preference but it's not used atm. This also improve
the performance removing 1/3 of the outline cost.

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

M	source/blender/draw/modes/object_mode.c
M	source/blender/draw/modes/shaders/object_outline_detect_frag.glsl

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

diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 720a547f8f8..7868e8a8232 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -886,6 +886,8 @@ static void OBJECT_cache_init(void *vedata)
 	OBJECT_StorageList *stl = ((OBJECT_Data *)vedata)->stl;
 	DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
 	OBJECT_PrivateData *g_data;
+	/* TODO : use dpi setting for enabling the second pass */
+	const bool do_outline_expand = false;
 
 	if (!stl->g_data) {
 		/* Alloc transient pointers */
@@ -968,15 +970,17 @@ static void OBJECT_cache_init(void *vedata)
 
 		grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_expand);
 		DRW_shgroup_uniform_texture_ref(grp, "outlineColor", &e_data.outlines_blur_tx);
-		DRW_shgroup_uniform_bool(grp, "doExpand", &bTrue, 1);
+		DRW_shgroup_uniform_bool(grp, "doExpand", (do_outline_expand) ? &bTrue : &bFalse, 1);
 		DRW_shgroup_call_add(grp, quad, NULL);
 
 		psl->outlines_bleed = DRW_pass_create("Outlines Bleed Pass", state);
 
-		grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_bleed);
-		DRW_shgroup_uniform_texture_ref(grp, "outlineColor", &e_data.outlines_color_tx);
-		DRW_shgroup_uniform_bool(grp, "doExpand", &bFalse, 1);
-		DRW_shgroup_call_add(grp, quad, NULL);
+		if (do_outline_expand) {
+			grp = DRW_shgroup_create(e_data.outline_fade_sh, psl->outlines_bleed);
+			DRW_shgroup_uniform_texture_ref(grp, "outlineColor", &e_data.outlines_color_tx);
+			DRW_shgroup_uniform_bool(grp, "doExpand", &bFalse, 1);
+			DRW_shgroup_call_add(grp, quad, NULL);
+		}
 	}
 
 	{
@@ -984,9 +988,10 @@ static void OBJECT_cache_init(void *vedata)
 		psl->outlines_resolve = DRW_pass_create("Outlines Resolve Pass", state);
 
 		struct Gwn_Batch *quad = DRW_cache_fullscreen_quad_get();
+		GPUTexture **outline_tx = (do_outline_expand) ? &e_data.outlines_blur_tx : &e_data.outlines_color_tx;
 
 		DRWShadingGroup *grp = DRW_shgroup_create(e_data.outline_resolve_aa_sh, psl->outlines_resolve);
-		DRW_shgroup_uniform_texture_ref(grp, "outlineBluredColor", &e_data.outlines_blur_tx);
+		DRW_shgroup_uniform_texture_ref(grp, "outlineBluredColor", outline_tx);
 		DRW_shgroup_uniform_vec2(grp, "rcpDimensions", e_data.inv_viewport_size, 1);
 		DRW_shgroup_call_add(grp, quad, NULL);
 	}
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 1a46e207a37..771b6bcdc2e 100644
--- a/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
+++ b/source/blender/draw/modes/shaders/object_outline_detect_frag.glsl
@@ -58,13 +58,30 @@ void main()
 	id.w = texelFetchOffset(outlineId, texel, 0, ivec2( 1,  0)).r;
 #endif
 
-	float ref_depth = texelFetch(outlineDepth, texel, 0).r;
-	float scene_depth = texelFetch(sceneDepth, texel, 0).r;
+	bool outline = any(notEqual(id, uvec4(ref_id)));
+
+	ivec2 depth_texel = texel;
+	/* If texel is an outline but has no valid id ...
+	 * replace id and depth texel by a valid one.
+	 * This keeps the outline thickness consistent everywhere. */
+	if (ref_id == 0u && outline) {
+		depth_texel = (id.x != 0u) ? texel + ivec2(-1,  0) : depth_texel;
+		depth_texel = (id.y != 0u) ? texel + ivec2( 0, -1) : depth_texel;
+		depth_texel = (id.z != 0u) ? texel + ivec2( 0,  1) : depth_texel;
+		depth_texel = (id.w != 0u) ? texel + ivec2( 1,  0) : depth_texel;
+
+		ref_id = (id.x != 0u) ? id.x : ref_id;
+		ref_id = (id.y != 0u) ? id.y : ref_id;
+		ref_id = (id.z != 0u) ? id.z : ref_id;
+		ref_id = (id.w != 0u) ? id.w : ref_id;
+	}
+
+	float ref_depth = texelFetch(outlineDepth, depth_texel, 0).r;
+	float scene_depth = texelFetch(sceneDepth, depth_texel, 0).r;
 
 	/* Avoid bad cases of zfighting for occlusion only. */
 	const float epsilon = 3.0 / 8388608.0;
 	bool occluded = (ref_depth > scene_depth + epsilon);
-	bool outline = any(notEqual(id, uvec4(ref_id)));
 
 	FragColor = convert_id_to_color(int(ref_id));
 	FragColor.a *= (occluded) ? alphaOcclu : 1.0;



More information about the Bf-blender-cvs mailing list