ich zerbreche mir (mal wieder) meinen Kopf am 2D Modus. Mein Problem ist, dass Text wunderbar im 3D Modus ausgegeben wird, im 2D Modus allerdings nichts sichtbar ist. Ich habe mit glTranslateF schon verschiedene Werte ausprobiert, aber meines Erachtens sollte es klappen (glOrtho hat eine Tiefeneinstellung von -10 bis 1000). Im Netz habe ich viele Beispiele gefunden, wie Text im 3D Modus ausgegeben wird, allerdings nicht wirklich viele Anhaltspunkte zum glOrtho Modus.
Ich verwende folgende Funktionen, die auch funktionieren (Quelltext kann ich bei Interesse gerne posten, wollte das Topic aber erst mal schlank halten)
Code:
glSwitchTo2D(WinWidth, WinHeight); //In den orthogonalen Modus wechseln glSwitchTo3D(WinWidth, WinHeight); //Zurück in den 3D Modus wechseln glBuildFont(DC: HDC); //Font Liste initialisieren
Außerdem diese Prozedur um den Text auszugeben:
Code:
procedure glPrint(text : pchar); begin if text <> '' then // If There's No Text begin // Do Nothing glPushAttrib(GL_LIST_BIT); // Pushes The Display List Bits glListBase(FontLists); // Sets The Base Character glCallLists(length(text), GL_UNSIGNED_BYTE, text); // Draws The Display List Text glPopAttrib(); // Pops The Display List Bits end; end;
Und schließlich der eigentlich Aufruf:
Code:
glSwitchTo2D(WinWidth, WinHeight); //Switch to 2D mode glLoadIdentity; //Reset matrix glTranslatef(-2.5,0,-5); //Center text glPrint('12345XYZ'); //Text output glSwitchTo3D(WinWidth, WinHeight); //Switch back to 2D mode
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Poste mal wie du in den 2D-Modus wechselst, du hast das da ja gekapselt. Ich gehe mal davon aus dass du gluOrtho nimmst, und da dann eine Z-Range von -1 bis 1 oder so hast. Und da du deinen Text bei z = -5 zeichnest, wid der natürlich geclippt und nicht gezeigt.
Ich gehe mal davon aus dass du gluOrtho nimmst, und da dann eine Z-Range von -1 bis 1 oder so hast.
Um kurz C19H28O2 zu zitieren
Zitat:
(glOrtho hat eine Tiefeneinstellung von -10 bis 1000)
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Na dann halt die anderen üblichen Verdächtigen : - Backfaceculling - Vergessen dass der Ursprung bei OpenGL untenlinks liegt - Text evtl. zu klein (je nach Orthowerten)
Ansonsten einfach mal posten was SwitchTo2D genau macht. Evtl. liegt da ja schon der Fehler.
Ich denke an der 2D/ 3D Funktion wird es nicht liegen. Die hatte ich ja damals dank Eurer Hilfe korrigieren können - ich habe diese unten aufgeführt.
Bezüglich Größe kann ich es glaube ich auch ausschließen. Habe die Schriftgröße mal probehalber auf 120 bzw. 1200 gestellt und nichts gesehen. Außerdem verwende ich weiße Schrift auf schwarzem Grund, so dass auch einzelne Pixel sichtbar wären.
Backface Culling benutze ich nicht.
Code:
{------------------------------------------------------------------} { Toggles to 2D mode } {------------------------------------------------------------------} procedure glSwitchTo2D(WinWidth, WinHeight : integer); begin glViewport(0, 0, WinWidth,WinHeight); //Set Viewport to cover full window glDisable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho(0, WinWidth, 0, WinHeight, -10, 1000); glMatrixMode(GL_MODELVIEW); glPushMatrix; glLoadIdentity(); end;
Code:
{------------------------------------------------------------------} { Toggles back to 3D mode } {------------------------------------------------------------------} procedure glSwitchTo3D(WinWidth, WinHeight : integer); begin glEnable(GL_DEPTH_TEST); glMatrixMode(GL_PROJECTION); glPopMatrix(); glMatrixMode(GL_MODELVIEW); glPopMatrix(); //Resize OpenGl windows for 3D area glViewport(trunc(WinWidth*16/800), trunc(WinHeight*167/600), trunc(WinWidth*769/800), trunc(Winheight*417/600)); end;
Code:
{------------------------------------------------------------------} { Initializes fonts } {------------------------------------------------------------------} procedure glBuildFont(DC: HDC); // Build Our Font var Font: HFONT; // Windows Font ID gmf : array [0..255] of GLYPHMETRICSFLOAT; // Address Buffer For Font Storage begin FontLists := glGenLists(256); // Storage For Characters Font := CreateFont(12, // Height Of Font 0, // Width Of Font 0, // Angle Of Escapement 0, // Orientation Angle 0, // Bold 0, // Italics 0, // Underlined 0, // Strikethrough ANSI_CHARSET, // Character Set Identifier OUT_TT_PRECIS, // Output Precision CLIP_DEFAULT_PRECIS, // Clipping Precision ANTIALIASED_QUALITY, // Output Quality FF_DONTCARE or DEFAULT_PITCH, // Family And Pitch 'Arial Black'); // Font Name glEnable(GL_POINT_SMOOTH); SelectObject(DC, Font); // Select font type wglUseFontOutlines( DC, // Device Content 0, // Starting character 255, // Last character FontLists, // Font list 0.0, // Deviation From The True Outlines 0.3, // Font depth (Z-axis) WGL_FONT_POLYGONS, // Polygons, not lines @gmf); // Buffer end;
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn ich das richtig in Erinnerung habe ist die Schriftgröße bei Outlinefonts nebensächlich. Dort werden die Zeichen immer auf eine Höhe von 1 normiert (gemessen von der Baseline zum Ascent). Im Orthomodus ist übicherweise eine OpenGL Einheit gleich einem Pixel groß. Was dazu führen müsste, dass deine Schrift 1 Pixel groß ist. Egal ob du bei CreateFont als Größe 10, 100 oder 1000 angegeben hast. Diese Größe ist nur dann wirklich wichtig, wenn die Schriften auf ein DC gerendet werden müssen. Mach also mal vor der Ausgabe deiner Schrift so etwas wie ein glScale 40.
Nach weiterer Recherche im Netz scheint es, dass sich glOrtho und Outline Fonts nicht vertragen (habe kein Beispiel oder Tutorial finden können in dem glOrtho zusammen mit Outline Fonts verwendet werden).
Stattdessen habe ich für den 2D Modus auf Bitmap Fonts umgestellt und es klappt (gibt noch ein paar kleinere Bugs, aber die bügel ich schon alleine raus).
Code:
{------------------------------------------------------------------} { Output of text } {------------------------------------------------------------------} procedure glPrintText2D(X,Y,Size,Spacing,WinWidth,WinHeight:Integer; Text:string); var I : Integer; ascii : integer; begin //glSwitchTo2D(WinWidth, WinHeight); //Switch to 2D for I := 0 to length(Text)-1 do begin glBindTexture(GL_TEXTURE_2D, 32); //TEST ascii := ord(Text[I+1]); glBegin(GL_QUADS); glTexCoord((ascii mod 16)/16 , 16-((ascii DIV 16)+1)/16); glVertex2f(X+I*(Size+Spacing),Y); glTexCoord(((ascii mod 16)+1)/16, 16-((ascii DIV 16)+1)/16); glVertex2f(X+Size+I*(Size+Spacing),Y); glTexCoord(((ascii mod 16)+1)/16, 16-(ascii DIV 16)/16); glVertex2f(X+Size+I*(Size+Spacing),Y+Size); glTexCoord((ascii mod 16)/16 , 16-(ascii DIV 16)/16); glVertex2f(X+I*(Size+Spacing),Y+Size); glEnd; end; //glSwitchTo3D(WinWidth, WinHeight); //Switch to 3D end;
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
C19H28O2 hat geschrieben:
Nach weiterer Recherche im Netz scheint es, dass sich glOrtho und Outline Fonts nicht vertragen (habe kein Beispiel oder Tutorial finden können in dem glOrtho zusammen mit Outline Fonts verwendet werden).
Das halte ich allerdings mal für ein Gerücht. Ich habe schon OutlineFonts im Orthomodus verwendet. Ist zwar schon knapp 9 Jahre her aber es funktioniert. Warum sollte es auch nicht funktionieren? Es ist nur ein ordinäres 3D Objekt.
Warum du das nicht findest könnte eher daran liegen, dass es in den meisten Fällen wohl kaum wirklich Sinn macht. Und für blanke 2D Schrift sind Textur Fonts immer die sinnvollste Alternative. Diese liegen auch viel näher an den Aufgaben einer Grafikkarte. Dort solltest du auch bewusst zwischen Bitmap Fonts und Texture Fonts unterscheiden. Bitmap Fonts sind noch was anderes als das was du da verwendest (Texture Fonts).
PS: Das glSwitchTo2D und glSwitchTo3D solltest du in der Methode glPrintText2D auch auskommentiert lassen. Beim Rendern solltest du sehr sparsam mit dem Umschalten der Perspektive sein. Das benötigt sehr viel Leistung. Entsprechend sollten einzelne Operationen da nichts dran drehen sondern es sollte übergeordnet geschehen.
PS: Das glSwitchTo2D und glSwitchTo3D solltest du in der Methode glPrintText2D auch auskommentiert lassen. Beim Rendern solltest du sehr sparsam mit dem Umschalten der Perspektive sein. Das benötigt sehr viel Leistung. Entsprechend sollten einzelne Operationen da nichts dran drehen sondern es sollte übergeordnet geschehen.
Danke für den Tipp, ich werde es bei mir im Quelltext ändern.
_________________ Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)
Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.