[Bf-blender-cvs] [3725d82cee9] blender2.8: BLF: Opti: More clever sampling for blured glyphs.

Clément Foucault noreply at git.blender.org
Sun Apr 8 00:54:39 CEST 2018


Commit: 3725d82cee97b980e514aed1b226deb91aae9fe6
Author: Clément Foucault
Date:   Sun Apr 8 01:00:55 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB3725d82cee97b980e514aed1b226deb91aae9fe6

BLF: Opti: More clever sampling for blured glyphs.

Reduce the number of sampled required for blurring by using filtered
texture samples.

This changes the result a bit but it is not noticable.

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

M	source/blender/blenfont/intern/blf_glyph.c
M	source/blender/gpu/shaders/gpu_shader_text_frag.glsl

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

diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index 03d5b3ea07f..ad7e482f8e0 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -240,7 +240,7 @@ static void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc)
 	glBindTexture(GL_TEXTURE_2D, (font->tex_bind_state = gc->textures[gc->texture_current]));
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, gc->p2_width, gc->p2_height, 0, GL_RED, GL_UNSIGNED_BYTE, NULL);
 }
diff --git a/source/blender/gpu/shaders/gpu_shader_text_frag.glsl b/source/blender/gpu/shaders/gpu_shader_text_frag.glsl
index 3e5fdd8b90b..fbfa4cfcc9d 100644
--- a/source/blender/gpu/shaders/gpu_shader_text_frag.glsl
+++ b/source/blender/gpu/shaders/gpu_shader_text_frag.glsl
@@ -6,32 +6,16 @@ out vec4 fragColor;
 
 uniform sampler2D glyph;
 
-const vec2 offsets9[9] = vec2[9](
-	vec2(-1.0, -1.0), vec2( 0.0, -1.0), vec2( 1.0, -1.0),
-	vec2(-1.0,  0.0), vec2( 0.0,  0.0), vec2( 1.0,  0.0),
-	vec2(-1.0,  1.0), vec2( 0.0,  1.0), vec2( 1.0,  1.0)
+const vec2 offsets4[4] = vec2[4](
+	vec2(-0.5,  0.5), vec2( 0.5,  0.5),
+	vec2(-0.5, -0.5), vec2(-0.5, -0.5)
 );
 
-const vec2 offsets25[25] = vec2[25](
-	vec2(-2.0, -2.0), vec2(-1.0, -2.0), vec2( 0.0, -2.0), vec2( 1.0, -2.0), vec2( 2.0, -2.0),
-	vec2(-2.0, -1.0), vec2(-1.0, -1.0), vec2( 0.0, -1.0), vec2( 1.0, -1.0), vec2( 2.0, -1.0),
-	vec2(-2.0,  0.0), vec2(-1.0,  0.0), vec2( 0.0,  0.0), vec2( 1.0,  0.0), vec2( 2.0,  0.0),
-	vec2(-2.0,  1.0), vec2(-1.0,  1.0), vec2( 0.0,  1.0), vec2( 1.0,  1.0), vec2( 2.0,  1.0),
-	vec2(-2.0,  2.0), vec2(-1.0,  2.0), vec2( 0.0,  2.0), vec2( 1.0,  2.0), vec2( 2.0,  2.0)
-);
-
-const float weights9[9] = float[9](
-	1.0 / 16.0, 2.0 / 16.0, 1.0 / 16.0,
-	2.0 / 16.0, 4.0 / 16.0, 2.0 / 16.0,
-	1.0 / 16.0, 2.0 / 16.0, 1.0 / 16.0
-);
-
-const float weights25[25] = float[25](
-	1.0 / 60.0, 1.0 / 60.0, 2.0 / 60.0, 1.0 / 60.0, 1.0 / 60.0,
-	1.0 / 60.0, 3.0 / 60.0, 5.0 / 60.0, 3.0 / 60.0, 1.0 / 60.0,
-	2.0 / 60.0, 5.0 / 60.0, 8.0 / 60.0, 5.0 / 60.0, 2.0 / 60.0,
-	1.0 / 60.0, 3.0 / 60.0, 5.0 / 60.0, 3.0 / 60.0, 1.0 / 60.0,
-	1.0 / 60.0, 1.0 / 60.0, 2.0 / 60.0, 1.0 / 60.0, 1.0 / 60.0
+const vec2 offsets16[16] = vec2[16](
+	vec2(-1.5,  1.5), vec2(-0.5,  1.5), vec2( 0.5,  1.5), vec2( 1.5,  1.5),
+	vec2(-1.5,  0.5), vec2(-0.5,  0.5), vec2( 0.5,  0.5), vec2( 1.5,  0.5),
+	vec2(-1.5, -0.5), vec2(-0.5, -0.5), vec2( 0.5, -0.5), vec2( 1.5, -0.5),
+	vec2(-1.5, -1.5), vec2(-0.5, -1.5), vec2( 0.5, -1.5), vec2( 1.5, -1.5)
 );
 
 #define sample_glyph_offset(texco, texel, ofs) texture(glyph, texco + ofs * texel).r
@@ -54,44 +38,35 @@ void main()
 		if (texCoord_rect.w > 0) {
 			/* 3x3 blur */
 			/* Manual unroll for perf. (stupid glsl compiler) */
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[0]) * weights9[0];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[1]) * weights9[1];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[2]) * weights9[2];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[3]) * weights9[3];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[4]) * weights9[4];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[5]) * weights9[5];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[6]) * weights9[6];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[7]) * weights9[7];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets9[8]) * weights9[8];
+			fragColor.a += sample_glyph_offset(texco, texel, offsets4[0]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets4[1]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets4[2]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets4[3]);
+			fragColor.a *= (1.0 / 4.0);
 		}
 		else {
 			/* 5x5 blur */
 			/* Manual unroll for perf. (stupid glsl compiler) */
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 0]) * weights25[ 0];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 1]) * weights25[ 1];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 2]) * weights25[ 2];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 3]) * weights25[ 3];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 4]) * weights25[ 4];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 5]) * weights25[ 5];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 6]) * weights25[ 6];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 7]) * weights25[ 7];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 8]) * weights25[ 8];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[ 9]) * weights25[ 9];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[10]) * weights25[10];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[11]) * weights25[11];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[12]) * weights25[12];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[13]) * weights25[13];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[14]) * weights25[14];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[15]) * weights25[15];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[16]) * weights25[16];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[17]) * weights25[17];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[18]) * weights25[18];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[19]) * weights25[19];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[20]) * weights25[20];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[21]) * weights25[21];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[22]) * weights25[22];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[23]) * weights25[23];
-			fragColor.a += sample_glyph_offset(texco, texel, offsets25[24]) * weights25[24];
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 0]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 1]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 2]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 3]);
+
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 4]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 5]) * 2.0;
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 6]) * 2.0;
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 7]);
+
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 8]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[ 9]) * 2.0;
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[10]) * 2.0;
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[11]);
+
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[12]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[13]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[14]);
+			fragColor.a += sample_glyph_offset(texco, texel, offsets16[15]);
+			fragColor.a *= (1.0 / 20.0);
 		}
 	}



More information about the Bf-blender-cvs mailing list