FreeType

Started by
12 comments, last by Maddius 14 years, 8 months ago
Hi all, Has anyone used FreeType2 with directx 10? I want to use it rather than the ID3DX10Font stuff, as i've heard it's alot faster. Is it compatabile with Dx10, all I can find stuff about it on is with OpenGL, does it just draw directly onto the target window? Thanks all.
Advertisement
A part of the reason why FT2 is so portable is because it's well separated from the actual presentation side. This means that FT2 doesn't draw directly onto the target window. What it does for you is it takes in font files and produces raster bitmaps out of the glyphs present in the file. Whatever you do with those bitmaps after that is up to you. You can use FT2 with OGL, D3D9, D3D10 and D3D11 just fine, and it's usually quite straightforward to port the presentation code from one library to another, since OGL and D3D variants are very similar to each other.

There are some additional libraries that can do the drawing for you using different 3D APIs if you look around, but unfortunately I don't know of any that I could recommend.

About the performance bit.. well, yes, my implementation of FT2 fonts has significantly better performance than what I could get by using ID3DXFont. But do know that getting the maximum performance is not that straightforward and does require some careful design on how you draw text using the GPU (using texture atlases for glyph caches and minimizing # of draw calls with efficient use of dynamic vertex buffers). If implemented poorly, you can easily have a horrible performance compared to ID3DXFont.

If you go through the manual organization route, see if the code I use for caching font glyphs is any helpful: RectangleBinPack.h. An example of what the code produces can be found here:


[Edited by - clb on August 24, 2009 7:44:54 AM]
So if I used freetype to generate a bitmap of the text I want to display I could just fill a texture resource with that data and send it through my shader?

How do you make textures in d3d10 like this not using createfromfile?

Thanks all.
Yeah, that's pretty much how it would work.

If you look carefully at the documentation reference pages, you can find that there's ID3D10Device::CreateTexture2D that works pretty much as advertised.
Ah okay cool, I will give it ago, I suppose at when you initialise the engine you could cache away common words or sentences and just reuse them with different world and scaling matricies, and then anything that needs to be created on the fly can be added to the cache to save time later.
Quote:Original post by clb


BTW an awesome piece of art. [smile]
Okay, still not totally sure where FreeType creates the bitmap data, I have looked at the documentation and there is a face::bitmap variable which seems to be an array of chars?

Don't get how to turn this into the required data for Dx10.

Thanks
Quote:Original post by Konfusius
Quote:Original post by clb


BTW an awesome piece of art. [smile]


Thanks :) The rainbow palette shows the order in which the algorithm puts new characters into the atlas, i.e. characters with similar colors have been allocated nearly after each other.

Quote:Original post by Maddius
Okay, still not totally sure where FreeType creates the bitmap data, I have looked at the documentation and there is a face::bitmap variable which seems to be an array of chars?

Don't get how to turn this into the required data for Dx10.

Thanks


I put up some code that I use for extracting the glyph characters, see FT2/:

  • FTFont.h

  • FTSystem.h

  • FTSystem.cpp

  • RectangleBinPack.h


  • There's some \TODO's around since that code is a bit old, from the time I was doing some initial tests. Unfortunately I can not post the version where I've finished the \TODO's because I do not have all rights to that code anymore (I'm sure you can understand). You can still see how the raster data is generated and extracted using FT2. If you look at the FT2 sample you have for OpenGL, you can see it does something very similar to this code. You may use the code above for whatever purposes and modify it how you wish, no need to retain original acknowledgements, it's in Public Domain. Hope it answers your questions!
    Thanks for posting that code but I just dont think I understand the method FreeType uses.

    Does it store the data as RGB values for each pixel in the bitmap or are they shades of grey or what? I think I need a background on what it acctually does, sorry to be such a klutz but once I understand what it acctually does I can probably implement something.

    Im just confused as to HOW FreeType stores it's bitmap data.

    Thanks for your time mate.
    Quote:Original post by Maddius
    Thanks for posting that code but I just dont think I understand the method FreeType uses.

    Does it store the data as RGB values for each pixel in the bitmap or are they shades of grey or what? I think I need a background on what it acctually does, sorry to be such a klutz but once I understand what it acctually does I can probably implement something.

    Im just confused as to HOW FreeType stores it's bitmap data.

    Thanks for your time mate.


    See the FTSystem.cpp, line 100:

    clb::u8 intensity = ftBitmap->buffer[y * ftBitmap->pitch + x];


    That is exactly what FT2 does - it returns grayscale intensities at each pixel. The line above extracts this intensity at (x,y) and modulates a (r,g,b) triplet by this intensity.

    FreeType 2 Documentation describes this whole process. The tutorial, step 1 says about FT_Render_Glyph:

    Quote:
    The parameter render_mode is a set of bit flags used to specify how to render the glyph image. Set it to FT_RENDER_MODE_NORMAL to render a high-quality anti-aliased (256 gray levels) bitmap, as this is the default. You can alternatively use FT_RENDER_MODE_MONO if you want to generate a 1-bit monochrome bitmap.


    The reference for FT_Render_Glyph is available online here. You draw to a FT_GlyphSlot, and its fields are specified in FT_GlyphSlotRec page. It has a member FT_Bitmap, which holds the actual pixel buffer for the outputted glyph data.

    As you can see from FTSystem.cpp, the code required to do the glyph generation is not much. I recommend you read the tutorial closely since that describes how to place the glyphs properly on the drawing canvas (proper kerning, spacing and leading). They have a nice reference implementation you can use.

    Hope that helps,

    This topic is closed to new replies.

    Advertisement