Jump to content

  • Log In with Google      Sign In   
  • Create Account


FreeType


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
13 replies to this topic

#1 Maddius   Members   -  Reputation: 146

Like
0Likes
Like

Posted 23 August 2009 - 12:55 AM

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.

Sponsor:

#2 clb   Members   -  Reputation: 1780

Like
0Likes
Like

Posted 23 August 2009 - 02:44 AM

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]
Me+PC=clb.demon.fi | C++ Math and Geometry library: MathGeoLib, test it live! | C++ Game Networking: kNet | 2D Bin Packing: RectangleBinPack | Use gcc/clang/emcc from VS: vs-tool | Resume+Portfolio | gfxapi, test it live!

#3 Maddius   Members   -  Reputation: 146

Like
0Likes
Like

Posted 23 August 2009 - 03:12 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.

#4 clb   Members   -  Reputation: 1780

Like
0Likes
Like

Posted 23 August 2009 - 09:09 AM

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.
Me+PC=clb.demon.fi | C++ Math and Geometry library: MathGeoLib, test it live! | C++ Game Networking: kNet | 2D Bin Packing: RectangleBinPack | Use gcc/clang/emcc from VS: vs-tool | Resume+Portfolio | gfxapi, test it live!

#5 Maddius   Members   -  Reputation: 146

Like
0Likes
Like

Posted 23 August 2009 - 09:41 AM

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.

#6 demonkoryu   Members   -  Reputation: 976

Like
0Likes
Like

Posted 23 August 2009 - 10:10 AM

Quote:
Original post by clb


BTW an awesome piece of art. [smile]

#7 Maddius   Members   -  Reputation: 146

Like
0Likes
Like

Posted 23 August 2009 - 10:26 AM

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

#8 clb   Members   -  Reputation: 1780

Like
0Likes
Like

Posted 24 August 2009 - 01:37 AM

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!
    Me+PC=clb.demon.fi | C++ Math and Geometry library: MathGeoLib, test it live! | C++ Game Networking: kNet | 2D Bin Packing: RectangleBinPack | Use gcc/clang/emcc from VS: vs-tool | Resume+Portfolio | gfxapi, test it live!

    #9 Maddius   Members   -  Reputation: 146

    Like
    0Likes
    Like

    Posted 24 August 2009 - 08:13 AM

    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.

    #10 clb   Members   -  Reputation: 1780

    Like
    0Likes
    Like

    Posted 24 August 2009 - 08:34 AM

    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,
    Me+PC=clb.demon.fi | C++ Math and Geometry library: MathGeoLib, test it live! | C++ Game Networking: kNet | 2D Bin Packing: RectangleBinPack | Use gcc/clang/emcc from VS: vs-tool | Resume+Portfolio | gfxapi, test it live!

    #11 Maddius   Members   -  Reputation: 146

    Like
    0Likes
    Like

    Posted 24 August 2009 - 09:13 AM

    Okay so bitmap buffer is a 1d array which contains values ranging from 0 to 128? Or 0 to 255? Either way that is how intense the pixel is. Okay, so then if you wanted to change the color of the text you could just change it in the shader I guess.

    So you would use the glyph interface to create your (text or does it create just one character?) and then drop all the data in the buffer into some format that directx understands as a texture.

    Okay I think i'm getting there will start implementing this soon.

    Thanks a bunch man.

    -------
    edit:

    I guess pixels with zero intensity can then have zero alpha in the texture so that you will only get the text displayed and everything else blends in with the scene behind.

    [Edited by - Maddius on August 24, 2009 3:13:29 PM]

    #12 Anon Mike   Members   -  Reputation: 1098

    Like
    0Likes
    Like

    Posted 24 August 2009 - 10:22 AM

    I can understand the attraction of FreeType for people wanting portable text rendering. But if you're locked into Windows already (and it seems you are), and you are going to go through all the extra effort of manually caching and rendering rasterized glyphs, why not just use GDI? It'll give you bitmaps just fine and you don't have to deal with the additional dependencies of a third-party library.

    #13 Maddius   Members   -  Reputation: 146

    Like
    0Likes
    Like

    Posted 24 August 2009 - 10:30 AM

    Yeah i'm beggining to think it might not be such a bad idea to just use the ID3DX10Font stuff, I guess it provides some functionality to just produce a texture and then shove it through a shader. My game is a FPS and shouldn't be too heavy on text, and any text there is can be pretty much created and stored at initialisation.

    ----
    edit:

    Or does it do it like it did in DX9, straight through GDI and onto the screen, which isn't bad I guess for something simple but you cant get alpha blending then I guess. How great would the slow down be with using the ID3DX10Font stuff do you think?

    [Edited by - Maddius on August 24, 2009 5:30:41 PM]

    #14 Maddius   Members   -  Reputation: 146

    Like
    0Likes
    Like

    Posted 25 August 2009 - 08:01 AM

    Hi guys,

    I have started implementing ID3DX10Font and have run into the classic of the calls of the Font API changing the render states, is there a method to save and reload render states?

    Thanks.




    Old topic!
    Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



    PARTNERS