<div dir="ltr"><div>Hi All,<br></div><div><br></div><div>Over the last couple of months I've been working on changes to osgText that change the way text is rendered with the aim of improving visual quality, in particular when using outline and shadows or zooming and zooming out.</div><div><br></div><div>The new implementation uses shaders to implement outline and shadows, the old multi-pass approach has been removed completely.  If your hardware doesn't support shaders then I'm afraid you'll no longer see outlines/shadows by as it's been well over a decade that GLSL has become mainstream I don't think this should be an issue.  Removing the old codes paths help simplify the internals of osgText.</div><div><br></div><div>The use of shaders also opens the door to implement new techniques the most significant one is that osgText now support generation of and use of Signed Distance Field (SDF) based glyph textures. The SDF texture data is automatically created from the original grey scale image data that freetype and other font reading plugins provide.  SDF strength is when you zoom in close to the text you get smoother endges without the pixelation that is present with traditional textured glyphs.  Previous to get readable results with large characters on screen we'd need to push up the font resolution really high, using SDF's this is no longer required.</div><div><br></div><div>The new shaders also allows us to do multi-sampling in more creative ways that can help address rendering artefacts associated with outline and shadows when zoomed far out from the text - previously text would saturate to the backdrop colour (typically black) and do so with aliasing artefacts.  The new text implementation will provide more smooth transitions from near to far and fade out into the distance in a natural way.</div><div><br></div><div>The different techniques from rendering the text are now controlled using the following methods:</div><div><br></div><div>1) Setting the text directly:</div><div><br></div><div>    text->setShaderTechniqure(<wbr>osgText::GREYSALE); // the default<br></div><div><br><div>    text->setShaderTechniqure(<wbr>osgText::SIGNED_DISTANCE_<wbr>FIELD);<br></div><div><div><br><div>    text->setShaderTechniqure(<wbr>osgText::ALL_FEATURES); // create GlyphTexture with both GREYSCALE and SIGNED_DISTANCE_FIELD, shader defaulting to  SDF<br></div><div><br><div><div>    text->setShaderTechniqure(<wbr>osgText::NO_TEXT_SHADER); // disable use of shaders<br></div><div><br></div><div>2) Setting the global default value of Text::ShaderTechnique using osg::DisplaySettings::setTextShaderTechnique(..)  :</div><div><br></div><div><br></div><div>    osg::DisplaySettings::<wbr>instance()-><wbr>setTextShaderTechnque("<wbr>GREYSCALE");<br><div>    osg::DisplaySettings::<wbr>instance()-><wbr>setTextShaderTechnque("SIGNED_DISTANCE_FUNCTION");<br><div>    osg::DisplaySettings::<wbr>instance()-><wbr>setTextShaderTechnque("SDF"); // short for above</div><div>    osg::DisplaySettings::<wbr>instance()-><wbr>setTextShaderTechnque("ALL_FEATURES");<br><div>    osg::DisplaySettings::<wbr>instance()-><wbr>setTextShaderTechnque("NO_TEXT_SHADER");<br><div>    osg::DisplaySettings::<wbr>instance()-><wbr>setTextShaderTechnque("NONE); // short for above<br><div><br></div></div></div></div></div></div></div></div></div></div></div><div>3) Setting the above DisplaySettings::setTextShaderTechnique(..) string using env var:</div><div><br></div><div>   export OSG_TEXT_SHADER_TECHNIQUE="SDF"</div><div><br></div><div><br></div><div>--</div><div><br></div><div>As part of this work I added the ability to assign osg::DisplaySetting assigned user values to shaders using DisplaySettings::setValue(name, value).  You can use this to pass in globals your shaders, which you can leverage for setting things like #version and precision hint, which in turn means you can pass in these settings for different platfrom targets, making it much easier to share shaders between GL2, GL3 and GLES.</div><div><br></div><div>To help with this DisplaySetting automatically sets up the follow values:</div><div><br></div><div>OSG_GLSL_VERSION</div><div>OSG_PRECISION_FLOAT</div><div>OSG_VARYING_IN</div><div>OSG_VARYING_OUT</div><div><br></div><div>When you build the OSG specifically against a GL2, GL3/GLCORE, GLES2 or GLES3 target the appropriate defaults will set, then in your sharer you can use the following syntax:</div><div><br></div><div>$OSG_GLSL_VERSION</div><div><br></div><div>$OSG_PRECISION_FLOAT</div><div><br></div><div>$OSG_VARYING_OUT vec2 texCoord;</div><div><br><div>$OSG_VARYING_IN vec2 texCoord;</div><div><br></div></div><div>You can have a look at the new OpenSceneGraph-Data/shaders/text.vert and text.frag to see these in action.  Just update to master of OpenSceneGraph-Data to see these shaders.</div><div><br></div><div>--</div><div><br></div><div>Now while the internals of osgText have changed significantly the API is largely identical so hopefully you'll just need to pull down OSG master and build the OSG and your application and text will just work (using the GREYSCALE default code path.)  Visually it should be pretty similar when using this default - you should start to see improvements when doing things like outlines/shadows or when enabling SDF.<br></div><div><br></div><div>If there are any issues let me know,<br></div><div><br></div><div>Robert.<br></div><div><br></div><div><br></div><div><br></div></div>