Updated text_sdf_frag.cpp from OpenSceneGraph-Data changes that add outline generation for non SIGNED_DISTANCE_FIELD text.

This commit is contained in:
Robert Osfield
2017-10-12 11:12:47 +01:00
parent d6af00d9bd
commit eebb679754

View File

@@ -9,9 +9,18 @@ char text_sdf_frag[] = "$OSG_GLSL_VERSION\n"
" #endif\n"
"#endif\n"
"\n"
"$OSG_PRECISION_FLOAT\n"
"#if !defined(GL_ES)\n"
" #if __VERSION__>=400\n"
" #define osg_TextureQueryLOD textureQueryLod\n"
" #else\n"
" #extension GL_ARB_texture_query_lod : enable\n"
" #ifdef GL_ARB_texture_query_lod\n"
" #define osg_TextureQueryLOD textureQueryLOD\n"
" #endif\n"
" #endif\n"
"#endif\n"
"\n"
"#undef SIGNED_DISTNACE_FIELD\n"
"$OSG_PRECISION_FLOAT\n"
"\n"
"#if __VERSION__>=130\n"
" #define TEXTURE texture\n"
@@ -28,6 +37,14 @@ char text_sdf_frag[] = "$OSG_GLSL_VERSION\n"
"$OSG_VARYING_IN vec2 texCoord;\n"
"$OSG_VARYING_IN vec4 vertexColor;\n"
"\n"
"#ifndef TEXTURE_DIMENSION\n"
"const float TEXTURE_DIMENSION = 1024.0;\n"
"#endif\n"
"\n"
"#ifndef GLYPH_DIMENSION\n"
"const float GLYPH_DIMENSION = 32.0;\n"
"#endif\n"
"\n"
"#ifdef SIGNED_DISTNACE_FIELD\n"
"\n"
"float distanceFromEdge(vec2 tc)\n"
@@ -88,13 +105,6 @@ char text_sdf_frag[] = "$OSG_GLSL_VERSION\n"
" vec2 dx = dFdx(texCoord)*sample_distance_scale;\n"
" vec2 dy = dFdy(texCoord)*sample_distance_scale;\n"
"\n"
" #ifndef TEXTURE_DIMENSION\n"
" float TEXTURE_DIMENSION = 1024.0;\n"
" #endif\n"
"\n"
" #ifndef GLYPH_DIMENSION\n"
" float GLYPH_DIMENSION = 32.0;\n"
" #endif\n"
"\n"
" float distance_across_pixel = length(dx+dy)*(TEXTURE_DIMENSION/GLYPH_DIMENSION);\n"
"\n"
@@ -151,26 +161,57 @@ char text_sdf_frag[] = "$OSG_GLSL_VERSION\n"
"\n"
" return total_color;\n"
"}\n"
"\n"
"#else\n"
"\n"
"vec4 textureColor()\n"
"{\n"
" #ifdef OUTLINE\n"
" // glyph.rgba = (signed_distance, thin_outline, thick_outline, glyph_alpha)\n"
" vec4 glyph = TEXTURE(glyphTexture, texCoord);\n"
" float alpha = TEXTURE(glyphTexture, texCoord).a;\n"
"\n"
" float outline_alpha = (OUTLINE<=0.05) ? glyph.g : glyph.b;\n"
"#ifdef OUTLINE\n"
"\n"
" float alpha = glyph.a+outline_alpha;\n"
" if (alpha>1.0) alpha = 1.0;\n"
" float delta_tc = 1.6*OUTLINE*GLYPH_DIMENSION/TEXTURE_DIMENSION;\n"
"\n"
" return vec4( vertexColor.rgb*glyph.a + BACKDROP_COLOR.rgb*outline_alpha, alpha);\n"
" float outline_alpha = alpha;\n"
" vec2 origin = texCoord-vec2(delta_tc*0.5, delta_tc*0.5);\n"
"\n"
" #else\n"
" float alpha = TEXTURE(glyphTexture, texCoord).a;\n"
" if (alpha==0.0) vec4(0.0, 0.0, 0.0, 0.0);\n"
" return vec4(vertexColor.rgb, alpha);\n"
" float numSamples = 3.0;\n"
" delta_tc = delta_tc/(numSamples-1);\n"
"\n"
" float background_alpha = 1.0;\n"
"\n"
" for(float i=0.0; i<numSamples; ++i)\n"
" {\n"
" for(float j=0.0; j<numSamples; ++j)\n"
" {\n"
" float local_alpha = TEXTURE(glyphTexture, origin + vec2(i*delta_tc, j*delta_tc)).a;\n"
" outline_alpha = max(outline_alpha, local_alpha);\n"
" background_alpha = background_alpha * (1.0-local_alpha);\n"
" }\n"
" }\n"
"\n"
" #ifdef osg_TextureQueryLOD\n"
" float mipmapLevel = osg_TextureQueryLOD(glyphTexture, texCoord).x;\n"
" if (mipmapLevel<1.0)\n"
" {\n"
" outline_alpha = mix(1.0-background_alpha, outline_alpha, mipmapLevel/1.0);\n"
" }\n"
" #endif\n"
"\n"
" if (outline_alpha<alpha) outline_alpha = alpha;\n"
" if (outline_alpha>1.0) outline_alpha = 1.0;\n"
"\n"
" if (outline_alpha==0.0) return vec4(0.0, 0.0, 0.0, 0.0); // outside glyph and outline\n"
"\n"
" vec4 color = mix(BACKDROP_COLOR, vertexColor, smoothstep(0.0, 1.0, alpha));\n"
" color.a = smoothstep(0.0, 1.0, outline_alpha);\n"
"\n"
" return color;\n"
"\n"
"#else\n"
" if (alpha==0.0) vec4(0.0, 0.0, 0.0, 0.0);\n"
" return vec4(vertexColor.rgb, vertexColor.a * alpha);\n"
"#endif\n"
"}\n"
"\n"
"#endif\n"