SFML community forums
Help => Graphics => Topic started by: Brendon on November 24, 2012, 08:30:25 pm
-
I have an OpenGL GL_Quad, and I'd like to render some truetype text onto it. I'm not sure what is the best way to do this, and was hoping to get some tips.
If I understand correctly, I can create a Font object, then export that out to a glyph texture sheet for OpenGL to use? I was also looking at the Text object and RenderTexture, but wasn't sure if that was a viable route. Are there other alternatives I'm missing?
-
I managed to generate a glyph texture sheet, and now have them being rendered on my polygons.
However, I'm now having a problem getting the correct UV coordinates. I assumed the glyph's TextureRect would give me 0-1 UV coordinates on the texture sheet, but I'm ending up with values such as these:
Left 0
Top 2.802597E-45
Width 1.821688E-44
Height 6.726233E-44
I'm not sure how to read that - any suggestions?
-
These values seem to be invalid, the textureRect member of sf::Glyph gives the texture coordinates in pixels (so you have to divide by width/height to get normalized coordinates).
-
I wrote a minimal example of getting the glyph data - perhaps I'm accessing it incorrectly. Here's the output, that displays TextureRect and Bounds values: http://blendogames.com/dev/glyph2.png (http://blendogames.com/dev/glyph2.png)(http://blendogames.com/dev/glyph2.png)
Here's the sample program's code (C#):
using System;using SFML;using SFML.Window;using SFML.Graphics;using Tao.OpenGl;namespace WindowTest
{ public class Game1
{ static void Main
() { const uint FONTSIZE
= 48; RenderWindow appWindow
; Font myFont
; Texture myTexture
; Glyph myGlyph
; appWindow
= new RenderWindow
(new VideoMode
(640,
480,
32),
"Window test"); myFont
= new Font
(@"arial.ttf"); //set up the glyphs. for (uint i
= 65; i
< 68; i
++) { //65 = A, 66 = B, 67 = C, etc. myGlyph
= myFont
.GetGlyph(i, FONTSIZE,
false); Console
.WriteLine("Letter unicode: {0} TextureRect left: {1} top: {2} width: {3} height: {4} Bounds left: {5} top: {6} width: {7} height: {8}",
i, myGlyph
.TextureRect.Left, myGlyph
.TextureRect.Top, myGlyph
.TextureRect.Width, myGlyph
.TextureRect.Height,
myGlyph
.Bounds.Left, myGlyph
.Bounds.Top, myGlyph
.Bounds.Width, myGlyph
.Bounds.Height); } //bind the font texture. myTexture
= myFont
.GetTexture(FONTSIZE
); myTexture
.Bind(); //setup opengl. Gl
.glMatrixMode(Gl
.GL_PROJECTION); Gl
.glLoadIdentity(); Glu
.gluPerspective(90
.0F, 1
.0F, 1
.0F, 500
.0F
); Gl
.glEnable(Gl
.GL_TEXTURE_2D); Gl
.glColor4f(1
.0F, 1
.0F, 1
.0F, 1F
); Gl
.glEnable(Gl
.GL_BLEND); Gl
.glBlendFunc(Gl
.GL_SRC_ALPHA, Gl
.GL_ONE_MINUS_SRC_ALPHA); //render the opengl cube. while (appWindow
.IsOpen()) { appWindow
.DispatchEvents(); appWindow
.Clear(new Color
(255,
128,
128)); Gl
.glClear(Gl
.GL_DEPTH_BUFFER_BIT); Gl
.glMatrixMode(Gl
.GL_MODELVIEW); Gl
.glLoadIdentity(); Gl
.glTranslatef(0
.0F, 0
.0F,
-120
.0F
); //draw a background border square. Gl
.glDisable(Gl
.GL_BLEND); Gl
.glColor4f(1
.0F, 0
.6F, 1
.0F, 1F
); Gl
.glBegin(Gl
.GL_QUADS); Gl
.glTexCoord2f(0,
1); Gl
.glVertex3f(-50
.0F,
-50
.0F, 49
.0F
); Gl
.glTexCoord2f(0,
0); Gl
.glVertex3f(-50
.0F, 50
.0F, 49
.0F
); Gl
.glTexCoord2f(1,
0); Gl
.glVertex3f(50
.0F, 50
.0F, 49
.0F
); Gl
.glTexCoord2f(1,
1); Gl
.glVertex3f(50
.0F,
-50
.0F, 49
.0F
); Gl
.glEnd(); Gl
.glEnable(Gl
.GL_BLEND); // Draw the letters square Gl
.glColor4f(1
.0F, 1F, 1
.0F, 1F
); Gl
.glBegin(Gl
.GL_QUADS); Gl
.glTexCoord2f(0,
1); Gl
.glVertex3f(-50
.0F,
-50
.0F, 50
.0F
); Gl
.glTexCoord2f(0,
0); Gl
.glVertex3f(-50
.0F, 50
.0F, 50
.0F
); Gl
.glTexCoord2f(1,
0); Gl
.glVertex3f(50
.0F, 50
.0F, 50
.0F
); Gl
.glTexCoord2f(1,
1); Gl
.glVertex3f(50
.0F,
-50
.0F, 50
.0F
); Gl
.glEnd(); appWindow
.Display(); } } }}
-
Thanks for the minimal code. It was a bug in SFML.Net, it's now fixed.