PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann man Schrift unter OpenGL ausgeben?


Lord Nikon
2003-10-05, 16:23:40
Hi ,
ich möchte gerne wissen , wie man Schrift unter OpenGL am einfachsten ausgeben kann und außerdem die Position festlegen kann , wo die Schrift erscheinen soll.

Vedek Bareil
2003-10-06, 03:59:10
vielleicht versuchst du's mal hier:
http://nehe.gamedev.net/lesson.asp?index=03

ein Codebeispiel:

GLvoid glPrint(const char *fmt, ...) // Custom GL "Print" Routine
{
char text[256]; // Holds Our String
va_list ap; // Pointer To List Of Arguments

if (fmt == NULL) // If There's No Text
return; // Do Nothing

va_start(ap, fmt); // Parses The String For Variables
vsprintf(text, fmt, ap); // And Converts Symbols To Actual Numbers
va_end(ap); // Results Are Stored In Text

glPushAttrib(GL_LIST_BIT); // Pushes The Display List Bits
glListBase(base - 32); // Sets The Base Character to 32
glCallLists(strlen(text),
GL_UNSIGNED_BYTE, text); // Draws The Display List Text
glPopAttrib(); // Pops The Display List Bits
}

:)

Lord Nikon
2003-10-06, 13:39:37
Danke für den Link. Text kann ich jetzt ausgeben , aber die ich hab die Positionierung habe ich noch nicht ganz verstanden. Was macht der Befehl glRasterPos2f ?

ToASter
2003-10-06, 17:59:14
glRasterPos2f(GLFLOAT x, GLFLOAT y);

mit diesem Aufruf stzt du den internen "cursor" von Opengl auf eine bestimmte Bildschirmposition wobei (wenn ich mich richtig erinnere x=0 und y=0 für die untere linke ecke, und x=1 und y=1 für die obere rechte ecke steht...(weis jetzt nich genau, kann aber auch sein das x=0 und y=0 die mitte des bildschirmes sind

Xmas
2003-10-06, 18:21:26
Original geschrieben von ToASter
glRasterPos2f(GLFLOAT x, GLFLOAT y);

mit diesem Aufruf stzt du den internen "cursor" von Opengl auf eine bestimmte Bildschirmposition wobei (wenn ich mich richtig erinnere x=0 und y=0 für die untere linke ecke, und x=1 und y=1 für die obere rechte ecke steht...(weis jetzt nich genau, kann aber auch sein das x=0 und y=0 die mitte des bildschirmes sind

Die bei glRasterPos{234}{ifds}[v] übergebenen Koordinaten werden genauso wie Vertices transformiert. Wenn du die Transformation umgehen willst (was meist gewünscht ist) musst du glWindowPos{23}{ifds}[v] nutzen.

Dies ist leider erst in GL1.4 Standard. Sonst musst du die Modelview- und Projection-Matrix auf Identity setzen.

btw, gibt es irgendwo GL1.4 Libs die das ganze wglGetProcAddress überflüssig machen?

ScottManDeath
2003-10-06, 20:11:34
Original geschrieben von Xmas
btw, gibt es irgendwo GL1.4 Libs die das ganze wglGetProcAddress überflüssig machen?


unter windows nicht nur unter linux, allerdings kann man sich die ganze arbeit mit bibliotheken wie glew (http://glew.sourceforge.net/) wesenlich erleichtern

ScottManDeath
2003-10-06, 20:23:17
// Text ausgeben an position x,y,z, format ... wie bei printf
// Achtung: positionen gehen durch modelview matrix und projection matrix
void gltutText(GLfloat x, GLfloat y, GLfloat z,const char *format,...)
{
int len, i;
char printBuffer[1024];
va_list list;

va_start(list, format);
vsprintf(printBuffer, format, list);
va_end(list);

glRasterPos3f(x, y,z);

len = (int) strlen(printBuffer);
for (i = 0; i < len; i++)
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, printBuffer[i]);


}


in der ausgabe dan folgendes



glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
gluOrtho2D(0,w,h,0); // matrix so dass objektkoordinaten == fensterkoordinaten, w und h sind die höhe/breite des fensters



glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

//begin ausgabe

gltutText(640,480,0,"hello world , files was compiled on %s",__DATE__);

// ende ausgabe

glPopMatrix();

glMatrixMode(GL_PROJECTION);
glPopMatrix();

glMatrixMode(GL_MODELVIEW);

Xmas
2003-10-06, 23:47:56
Original geschrieben von ScottManDeath
unter windows nicht nur unter linux, allerdings kann man sich die ganze arbeit mit bibliotheken wie glew (http://glew.sourceforge.net/) wesenlich erleichtern
Ich wurde gerade bei ATI fündig: http://www.ati.com/developer/sdk/radeonSDK/html/info/Prog3D.html (extSetupLib.zip)

Scheint für GL1.4 und für von ATI angebotene Extensions brauchbar zu sein. Von NVidia gab es glaub ich mal was ähnliches, aber das OGL SDK ist auf der NVidia-Seite irgendwie nicht mehr zu finden.