Updated text_sdf_frag.cpp from OpenSceneGraph-Data changes that add outline generation for non SIGNED_DISTANCE_FIELD text.
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user