OpenGL Fonts - Das ewige Problem
-

Ich versuche seit geraumer Zeit (mir ist schon ein Bart gewachsen) Nehe's Font-Funktionen in mein Projekt einzubauen.Hier ist der Code:
GLuint CharSet; // Ist global // Den Font erstellen void CreateGLFont() { HFONT font; // Windows Font ID HFONT oldfont; // Used For Good House Keeping CharSet = glGenLists(96); // Storage For 96 Characters font = CreateFont( -nHeight, // Height Of Font 0, // Width Of Font 0, // Angle Of Escapement 0, // Orientation Angle FW_BOLD, // Font Weight FALSE, // Italic FALSE, // Underline FALSE, // Strikeout ANSI_CHARSET, // Character Set Identifier OUT_TT_PRECIS, // Output Precision CLIP_DEFAULT_PRECIS, // Clipping Precision ANTIALIASED_QUALITY, // Output Quality FF_DONTCARE|DEFAULT_PITCH, // Family And Pitch "Courier New"); // Font Name oldfont = (HFONT)SelectObject(m_hgldc, font); // Selects The Font We Want wglUseFontBitmaps(m_hgldc, 32, 96, CharSet); // Builds 96 Characters Starting At Character 32 SelectObject(m_hgldc, oldfont); // Selects The Font We Want DeleteObject(font); } //Darstellung void DisplayText(const char *fmt, ...) { 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(CharSet - 32); // Sets The Base Character to 32 glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); // Draws The Display List Text glPopAttrib(); } //Meine Rendering Funktion void DrawGLScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0.0f,0.0f,-1.0f); glRasterPos2f(0.0f, 0.0f); DisplayText("Hallo Welt"); }Leider passiert gar nix
Kein Text zu sehen, keine Fehlermeldung, NADA 
Was mach ich falsch ?
-
bist du im ortho mode ???
glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, m_ScreenWidth, 0, m_ScreenHeight, -1, 1); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); va_list msglist; va_start(msglist, pszText); vsprintf(buffer, pszText, msglist); va_end(msglist); glTranslated(x, m_ScreenHeight - y, 0); glListBase(m_FontLstID - 32 + (128 * font)); glCallLists(strlen(buffer), GL_BYTE, buffer); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix();
-
Tut sich nix

BTW macht NeHe auch nichts mit Ortho

-
handle von CreateFont(...) ist auch ok
-
wenn du möchtest kann ich dir auch ne ferigte klasse geben...
-
Jep!
Mir scheint, als liegt das Problem bei der Darstellung und Positionierung.
Ich habe zum Beispiel keinen Plan, wie ich die Funktion glRasterPos2f zu verwenden hab. Laut MSDN ist 0,0 die mitte des Bildschirms. Aber gilt das auch bei allen Auflösungen ? Muss ich in spezielle Modis verwenden ?
-
glRasterPos2f
setzt die position an der gezeichnet werden soll von der bildschirmmitte (0,0) ausgehend.ich schau mir mal das tut an ........ cy
-
Zur Not nimm dir das Nehe Tutorial und nimm Zeile für Zeile raus, dann siehst du am besten was jede Zeile macht ...
-
Disable mal die 2D-Texturen
-
also bei mir funzt das tut mit deinen einstellungen
mach doch mal in render funktion einen test
glBegin(GL_LINES);
glVertex2f(-1.0f, -1.0f);
glVertex2f(1.0f, 1.0f);
glEnd();vielleicht hast du ein ganz anderes problem
-
*freu*

Das mit den Texturen hat funktioniert!
ein glDisable(GL_TEXTURE_2D) und schon gings.
Woran liegt das ?btw, stellt das mal bitte in die FAQ - hab das Problem schon öfters hier gesehen
Danke an alle (Jetzt kann ich mir den Bart abschneiden
)
-
Keine Ahnung woran das liegt, habs selbst auch nie verstanden.
Zu glRasterPosf(), schau dir mal die GL_ARB_window_pos Extension an.
Wurde extra eingefügt, weil RasterPos so nervig ist.
-
Hmm, woran liegt das wenn kein Ä,Ö oder Ü angezeigt wird ?

Passiert bei allen Schriftarten
-
ist das nicht sehr langsam?
ich meine ist nen bitmapfont nicht schneller so wie mans in directdraw gewöhnlich nutzt?ich dachte immer man sollte die
SelectObject() etc möglichst meiden da sie das programm ausbremsen.
-
Ä Ö Ü werden nicht richtig dargestellt weil ihr Ascii Code nicht mit dem in der Liste übereinstimmt, müsstest du also manuell nachtragen.
2.
Windows Fonts sind langsamer, TextureFonts sind schneller und unabhängiger
-
Wenn ich das richtig verstanden habe, werden die Windows-Fonts in Bitmaps gewandelt und in einer glList abgelegt. Dann wird das ganze nur noch in den Framebuffer geschrieben. Mit den 0815 Win GDI Fonts hat das doch nichts mehr am Hut oder ?
Davon abgesehen zieht das ganze wirklich ziemlich viel Performance
Wie könnte man NeHe's Font-Funktionen beschleunigen ? Ideen, Vorschläge und Geistesblitze erwünscht!
-
Render den ganzen Zeichensatz auf eine Textur und mach ne normale Bitmapfont draus.
-
Öhm, und wie render ich das auf eine Textur ?

-
hi,
ich glaube, bildschirmlisten sind schon schneller als die windows gdi http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17
also ich mache das mit einer textur die ich mit http://www.lmnopc.com/bitmapfontbuilder/
erstellt habe.
-
Oka, wieder ein anderes Problem

Jetzt krieg ich es nicht mehr hin, den Text farbig zu machen...
Um genauer zu sein, nimmt kein einziges Poly in meiner Szene eine mit glColor... gesetzte Farbe an
Woran kann das schon wieder liegen ?
Folgende OGL Funktionen sind während des Renderings aktiv:Texturing
Shading (Smooth)
Alpha-Testing
Blending
Licht (Ein Ambientes)
Stencil-Buffer OperationenStört irgendetwas daran das setzen von Farben ?

Oder woran kann es noch liegen ?
-
drei jahre später, aber es kommen ja immer noch leute her:
du musst die farbe VOR der rasterpos setzen.ein altguru hats so erklärt:
The trick is to set the color before you set the raster position:glColor3f(1.0, 0.0, 0.0); // sets the current color to red
glRasterPos2f(x, y); // sets the raster position and color
glColor3f(0.0, 1.0, 0.0); // sets the current color to blue
glBitmap(...); // draws a bitmap in redYou might expect to see a blue bitmap, but it will be red. In this
example, the second glColor() is just to demonstrate that the raster
color is set when you call glRasterPos(). The raster position is
treated like any other vertex: the position is transformed by the
current matrices, and the color is determined by the current color, or
by the current normal if lighting is enabled. Let me repeat that last
part: if lighting is enabled, the current color is ignored and the
raster color is determined by the lighting equation.