OK, there is a cool paper from Valve here, on using a signed distance field in the alpha channel of a texture to recover a nice vector-like representation of a shape using a simple alpha threshold, or looking a bit better in a shader with a smoothstep function.
Then I saw this journal, where OrangyTang was using it to render text.
So I thought it would be cool to have a tool to build these bitmap font textures from the raw TTF font files. And it would be really cool if it had similar features to the awesome AngelCode Bitmap Font Generator!
So I'm writing one, and here is the initial trial (it contains the exe and 3 very nice free fonts for testing purposes).
How to use:
* drag font files onto the exe
* the app asks for a texture size (256 will yield a 256x256 texture for each input font file)
* the app will render all valid glyphs in the ANSI range [0..255]
* the app will automatically search for the largest rendering size (integer pixels only, so hinting works with a greater range of TrueType fonts) where it can pack the output into the texture you specified earlier
* the app packs the rendered Signed Distance Field glyphs into a single texture
* look at the output PNG and TXT file (in the same directory as the font file)
* FreeType2 for font rendering
* LodePNG for saving the resultant file
* BinPacker code from GameDev's own jyk!
Please try it out and let me know what you think. Here are my ideas for where I'm going after this (please give any feedback or feature requests):
* I want to output a text file compliant with AngelCode's BMFont spec so existing loaders can use this output without changing anything other than the alpha threshold
* I want an XML file for configuration so you can specify specific unicode characters (I'm thinking <range>A B</range> and <chars>A B C...ZY ZZ</chars>)
* I want to allow an image for input, where a Signed Distance Field would then be computed from that into a lower resolution texture
So, what do you think? The source will be released (MIT) when I'm a bit closer to done. (Note, the RGB and A channels all share the same signed distance data, so there is a bit of a border to each glyph...I could just use all white for the color, but I think this looks pretty good.)