2011-08-21 11 views
6

Sto facendo un semplice platform 2D con C++, SDL e OpenGL e adesso vorrei visualizzazione del testo sullo schermo, ad esempio, punti, timer, semplici messaggi.testo semplice in OpenGL (senza GLUT)

Su vari siti ho letto che i Font Bitmap sarebbero probabilmente la strada da percorrere per questo, ma qualcuno potrebbe darmi un esempio semplice e intuitivo di come usarli in OpenGL per produrre un messaggio di prova sullo schermo?

EDIT: ho trovato qualcosa di interessante, FTGL. Il codice di esempio nel tutorial (2 ° link) sembra molto semplice. Non riuscivo a farlo funzionare, ma ci tornerò più tardi.

FTGL è una libreria cross-platform Open Source C++ che utilizza Freetype2 per semplificare il rendering dei caratteri nelle applicazioni OpenGL. FTGL supporta bitmap, pixmap, mappe di texture, profili, mesh poligonali e modalità di rendering di poligoni estrusi.

  1. http://sourceforge.net/projects/ftgl/
  2. http://ftgl.sourceforge.net/docs/html/ftgl-tutorial.html
  3. http://nehe.gamedev.net/tutorial/freetype_fonts_in_opengl/24001/

risposta

0

si deve creare un'immagine bitmap, che contiene tutti i caratteri che si desidera utilizzare. Il modo più semplice è con un font a larghezza fissa. Quindi per ogni lettera leghi quella parte della trama. Ho scritto questo codice in Pascal/anni OpenGL fa, cercherà e post

Modifica Ecco il codice

procedure DisplayString(str: string; l: integer; active: integer; align: integer); 
var i,n: integer; 
s: string; 
begin 
    glPushMatrix; 
    glTranslatef(0,-l,0); 
    if align=1 then glTranslatef(-15,0,0); //left alignment 
    if align=3 then glTranslatef(15,0,0);//right aligment 
    s:=uppercase(str); // the font is uppercase only 
    for i:=1 to length(str)-4 do begin 
    n:=ord(s[i]); // get the ASCII code of letter 
    glTranslatef(1,0,0); 
    if n=32 then continue; //space 
    if (n>=48) and (n<=58) then n:=n-47; // translate ascii code to the 
    if (n>=65) and (n<=90) then n:=n-53; // corresponding position in the bitmap 
     if active=0 then glBindTexture(GL_TEXTURE_2D, font2) // two different font files used 
    else glBindTexture(GL_TEXTURE_2D, font); 
    glBegin(GL_QUADS); // 1850 is the total width of the bitmap image, 50 is one character 
    glTexCoord2f(((n-1)*50/1850)-1, 0.0); glVertex3f(0.0, 0.0, 1.0); 
    glTexCoord2f((n*50/1850)-1, 0.0); glVertex3f(1.0, 0.0, 1.0); 
    glTexCoord2f((n*50/1850)-1, 1.0); glVertex3f(1.0, 1.0, 1.0); 
    glTexCoord2f(((n-1)*50/1850)-1, 1.0); glVertex3f(0.0, 1.0, 1.0); 
    glEnd(); 
    end; 
    glPopMatrix; 
end; 
+0

Non sono sicuro che questo è ciò di cui sto parlando. Perché non posso semplicemente usare alcuni font disponibili, come arial, verdana etc? – Ben

+5

Perché OpenGL non può renderli. Puoi usare le librerie additioanl per quello. Dai un'occhiata a queste FAQ: http://www.opengl.org/resources/faq/technical/fonts.htm –

-2

ho usato font bitmap che sono disponibili in GLUT. I rispettivi chiamate in JOGL (Java + OpenGL) sono:

GLU glu = new GLU(); 
GLUT glut = new GLUT(); 
GL gl = drawable.getGL(); 
gl.glRasterPos3f(x, y, z); // move to (x, y, z) for the next text output 
glut.glutBitmapString(GLUT.BITMAP_HELVETICA_12, "Message"); 
gl.glRasterPos3f (x2, y2, z2); 
glut.glutBitmapCharacter (GLUT.BITMAP_HELVETICA_18, 'X'); 

Questo può certamente essere adattate a OpenGL + C++ facilmente.

+2

Sto usando SDL, non GLUT. – Ben

1

Quando si utilizza già SDL perché non aggiungere SDL_ttf?

SDL_ttf è una libreria di rendering di carattere TrueType che viene utilizzato con il libreria SDL, e quasi altrettanto portatile. Dipende da freetype2 per gestire i dati dei font TrueType . Consente a un programmatore di utilizzare più font TrueType senza dover programmare autonomamente una routine di rendering dei font. Con la potenza dei caratteri di contorno e l'antialiasing, l'output di testo di alta qualità può essere ottenuto senza troppi sforzi.

2

Si può usare SDL_gfx, può testo di output utilizzando font bitmap come questo:

#include <SDL/SDL_gfxPrimitives.h> 
#include <SDL/SDL_gfxPrimitives_font.h> 

const char *text = "text to render"; 
stringColor(sdlSurface, x, y, text, 0xff0000ff); 
Problemi correlati