Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: So Jul 20, 2025 06:37

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Mär 16, 2010 18:27 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
Hallo zusammen,

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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 16, 2010 19:08 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 16, 2010 19:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Sascha Willems hat geschrieben:
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 16, 2010 19:21 
Offline
DGL Member
Benutzeravatar

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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 16, 2010 19:24 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja, ich denke dein Text ist vermutlich einfach winzig klein und steht oben links in den ersten 2-3 Pixeln. ;)

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Mär 16, 2010 21:39 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 17, 2010 10:20 
Offline
DGL Member
Benutzeravatar

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 oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 17, 2010 12:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 17, 2010 12:49 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 17, 2010 14:43 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
Zitat:
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)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.020s | 17 Queries | GZIP : On ]