Thread: [PyOpenGL-Users] Recommendations for font rendering
Brought to you by:
mcfletch
From: Derakon <de...@gm...> - 2010-07-01 05:11:32
|
I'm searching for a decent approach to font rendering for my game project. Apparently this is a big deal! Ideally I'd like something that: a) Is cross-platform, and b) Can load fonts in a standard format (precludes GLUT's stroke- and bitmap-fonts) I found PyFTGL, but I cannot for the life of me get it to build on my target platform (OSX)*, and if I can't then I doubt any potential future collaborators could either. I can't find any other solutions; am I going to have to make my own homebrew textured-quads-based approach (or make my own FTGL bindings)? Text rendering seems like such a basic part of game development that I'm amazed there aren't more general-purpose libraries available... * It doesn't know to use frameworks instead of searching directly for the OpenGL libraries. It can't find my Boost libraries, which are installed in a standard location. Hacking together my own build invocation doesn't seem to generate usable files for some reason. I'd give more details but frankly I spent two very painful evenings on it several weeks ago and only now am able to return to this hobby for a bit...I suspect the memories may be repressed. -Chris |
From: Ian M. <geo...@gm...> - 2010-07-01 05:16:53
|
Hi, I use PyGame, which is cross-platform, and can load standard font types. The font is rendered as a "surface", which can be changed to a texture and mapped your polygon(s). Ian |
From: Derakon <de...@gm...> - 2010-07-01 05:19:36
|
Oh dear, I knew I forgot to mention something. I was using PyGame before, but I'm switching to OpenGL for performance reasons, which of course prevents direct blitting to the screen using PyGame. I tried using a "blit text to surface and convert to quad and draw" approach, but with text that changes frequently that means making a ton of new surfaces and it just doesn't perform well at all (in particular, my in-game console was unusably slow). It seems likely I'd need an approach that allows for each character to be on its own textured quad that I can toss anywhere as needed. On Wed, Jun 30, 2010 at 10:16 PM, Ian Mallett <geo...@gm...> wrote: > Hi, > > I use PyGame, which is cross-platform, and can load standard font types. > The font is rendered as a "surface", which can be changed to a texture and > mapped your polygon(s). > > Ian > |
From: Nicolas R. <Nic...@lo...> - 2010-07-01 06:13:54
|
You can use pyftgl that binds the FTGL library (Freetype OpenGL) and is pretty standard. If you do not use too much fonts, you can also create some font bitmaps and load them as texture. Nicolas On Wed, 2010-06-30 at 22:19 -0700, Derakon wrote: > Oh dear, I knew I forgot to mention something. I was using PyGame > before, but I'm switching to OpenGL for performance reasons, which of > course prevents direct blitting to the screen using PyGame. I tried > using a "blit text to surface and convert to quad and draw" approach, > but with text that changes frequently that means making a ton of new > surfaces and it just doesn't perform well at all (in particular, my > in-game console was unusably slow). It seems likely I'd need an > approach that allows for each character to be on its own textured quad > that I can toss anywhere as needed. > > On Wed, Jun 30, 2010 at 10:16 PM, Ian Mallett <geo...@gm...> wrote: > > Hi, > > > > I use PyGame, which is cross-platform, and can load standard font types. > > The font is rendered as a "surface", which can be changed to a texture and > > mapped your polygon(s). > > > > Ian > > > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by Sprint > What will you do first with EVO, the first 4G phone? > Visit sprint.com/first -- http://p.sf.net/sfu/sprint-com-first > _______________________________________________ > PyOpenGL Homepage > http://pyopengl.sourceforge.net > _______________________________________________ > PyOpenGL-Users mailing list > PyO...@li... > https://lists.sourceforge.net/lists/listinfo/pyopengl-users |
From: Ian M. <geo...@gm...> - 2010-07-01 06:49:06
|
On Wed, Jun 30, 2010 at 10:19 PM, Derakon <de...@gm...> wrote: > Oh dear, I knew I forgot to mention something. I was using PyGame > before, but I'm switching to OpenGL for performance reasons, which of > course prevents direct blitting to the screen using PyGame. I tried > using a "blit text to surface and convert to quad and draw" approach, > but with text that changes frequently that means making a ton of new > surfaces and it just doesn't perform well at all (in particular, my > in-game console was unusably slow). It seems likely I'd need an > approach that allows for each character to be on its own textured quad > that I can toss anywhere as needed. > Hi, Yes, I've run into that problem too. My two cents on still using PyGame: My solution is to make an OpenGL character set out of PyGame as a texture atlas. The text to be rendered can then just be converted to a list of indices into the texture atlas and the individual characters drawn on individual quads using the proper subimage. I've used this technique for framerate counters in several (unreleased) games (situations where the text changes continuously). If for some reason even that is too slow (because of the extra geometry; I can only imagine this being an issue if you're trying to render thousands of characters at a time), you can cram those quads into a display list or VBO and cache the result for arbitrary use. A VBO will also let you update individual sections of the geometry, so you can still change section(s) of the cached text to whatever you want at the computational cost of updating * only* the changes. A more advanced technique would be to create words just by compositing character textures via glCopyTex______ functions. That will give you a single texture (a "word" texture atlas, if you will) that you can cache and draw on a single quad as you please. Of course, if the result of the font rendering is cached, the result only need be generated once--and there will be no drop in framerate, no matter how it was generated in the first place (direct rendering, texture atlas, glCopyWhatever() compositing, etc.). I've used this in conjunction with direct rendering for several games (ex: the now somewhat old Spacewar Multi<http://www.pygame.org/project-Spacewar+Multi-1025-.html>, whose code may help you) where I was too lazy to set up a proper character set (texture atlas). Ian |
From: Greg E. <gre...@ca...> - 2010-07-01 11:06:46
|
Derakon wrote: > It seems likely I'd need an > approach that allows for each character to be on its own textured quad > that I can toss anywhere as needed. One approach is to render all the characters into a big surface in a 16x16 grid or something like that, make a texture out of it, and then render characters from it using appropriate texture coordinates. Another is to use a separate texture for each character, although that may have more overhead, both in graphics memory usage and rendering time. -- Greg |