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

Aktuelle Zeit: Fr Jul 04, 2025 20:00

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



Ein neues Thema erstellen Auf das Thema antworten  [ 10 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Probleme mit glOrtho / glOrtho2d
BeitragVerfasst: Sa Aug 01, 2009 06:46 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Ich versuche gerade Text einen Text oder Linien im Ortho/Ortho2d Modus auszugeben, ich bekomme aber überhaupt keine Ausgabe, alles was im 3D-Projection-Mode gezeichnet wird scheint Ok zu sein.

Hier der Code der fraglichen Funktion:

Code:
  1.  
  2. procedure AbGlDrawMatrix(Matrix: PGLfloat; X, Y, Z: TGLfloat; AFont: TAbGlFont; ClientWidth, ClientHeight: Integer);
  3. var
  4.   I: Integer;
  5.   J: Integer;
  6. begin  
  7.   glPushMatrix;        { save current modell matrix to stack }
  8.   glTranslatef(X,Y,Z); { move to matrix output position }
  9.  
  10.   glMatrixMode(GL_PROJECTION); { switch to projection matrix }
  11.   glPushMatrix;                { save projection matrix to stack }
  12.  
  13.  
  14.   glOrtho(0,ClientWidth,0,ClientHeight, -1.01, 1.01); { set orthogonal perspective }
  15.  
  16.   glMatrixMode(GL_MODELVIEW);  { switch to model matrix }
  17.   glDisable(GL_DEPTH_TEST);    { disable the depth buffer }
  18.  
  19. // nur zu debug zwecken hier eingefügt
  20. //----------------------------------------
  21.  glColor3f(0.5, 0.5, 0.5);
  22.   for I := 0 to ClientWidth do
  23.   begin
  24.      glBegin(GL_LINE_STRIP);
  25.        glVertex2f(I,0);
  26.        glVertex2f(I,ClientHeight);
  27.      glEnd;
  28.   end;
  29. //----------------------------------------
  30.  
  31.   // do the job
  32.   for I := 0 to 3 do
  33.     for J := 0 to 3 do
  34.     begin
  35.       AFont.DrawText3f('a' + IntToStr(I) + IntToStr(J) + ': '
  36.                            + FormatFloat('0.00',
  37.                              Matrix[I*4+J]),   { print matrix values }
  38.                                     I * 10,         { calc x output pos }
  39.                                     J * - 30 , Z);  { calc y output pos }
  40.     end;
  41.  
  42.   glEnable(GL_DEPTH_TEST);      { enable the depth buffer }
  43.  
  44.   glMatrixMode(GL_PROJECTION);  { switch to projection matrix }
  45.   glPopMatrix;                  { restore old perspcetiv matrix from stack }
  46.  
  47.   glMatrixMode(GL_MODELVIEW);   { switch to model matrix }
  48.   glPopMatrix;                  { restore old modell matrix }  
  49. end;
  50.  

AFont.DrawText3f ist eine Hilfsroutine zur Darstellung von Text, diese funktioniert im 3D-Projection-Mode einwandfrei. Aber auch der eingefügte Debug-Code bringt keinen Output. Ich kann mir keinen Reim darauf machen?

In meiner Render-Procedure steht dann folgender Aufruf:

Code:
  1.  
  2. procedure TGLForm.Render;
  3. begin
  4.  // bis hier alles einwandfrei
  5.  // hier noch 3D-Perspektive
  6.  
  7.   abglDrawMatrix(@FObjMatrix, -5.0, 2.0, 0, FGLFontCN8p, ClientWidth, ClientHeight);
  8.  
  9.   // hier auch wieder 3D-Perspektive
  10.   // ab hier auch alles einwandfei
  11. end;
  12.  



Meine Vorgehensweise ist wie folgt:

* ) Modellmatrix muss aktiv sein( und das ist sie auch )
1 ) Sichern der aktuellen Modellmatrix auf den Stack.
2 ) Umschalten auf Projektionsmatrix
3 ) Sichern der aktuellen Projektionsmatrix
4 ) Zurücksetzen der Projectionsmatrix
5 ) Setzen der Ortho-Projektion
6 ) Aktivieren der Modellmatrix
8 ) Tiefenpuffer deaktivieren
7 ) >>>Zeichnen<<<
8 ) Tiefenpuffer aktivieren
9 ) Alle Matizen in ihrer Reihenfolge wieder herstellen.

Was ist falsch ?

PS: Wie kann ich einen Screen-Shot der Overlay-OpenGL-Ausgabe machen?

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 09:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Zitat:
4 ) Zurücksetzen der Projectionsmatrix

Das tust du nicht.

Zitat:
Code:
  1. glMatrixMode(GL_PROJECTION); { switch to projection matrix }
  2. glPushMatrix; { save projection matrix to stack }
  3.  
  4.  
  5. glOrtho(0,ClientWidth,0,ClientHeight, -1.01, 1.01); { set orthogonal perspective }


Ich zitiere aus dem Wiki: "glOrtho erstellt eine Matrix für Parallel-Projektion. Die aktuelle Matrix wird dabei mit der neu erstellten Matrix multipliziert.".
D.h. dadurch, dass du das LoadIdentity vergessen hast, ruinierst du mit glOrtho deine Matrix.

Zum Screenshot-Thema:
Das Einfachste wäre vermutlich, den ganzen Framebuffer mit glReadPixels auszulesen. Dann schreibst du einen gültigen
BMP-Header in eine Datei und lässt die Pixeldaten folgen. TGA wäre prinzipiell ähnlich leicht möglich, die Daten liegen bei
TGA aber laut Spezifikation in Big Endian vor (d.h. vorher Bytes tauschen).

Eine schnellere Methode wäre Render to Texture (also Framebuffer Object [zu bevorzugen] oder Pixelbuffer Object).

Edit:
Noch vergessen: Angucken, wie ein TGA oder BMP-Header aussieht, kannst du hier: http://www.wotsit.org
Ich meine aber wir hätten auch einen Screenshot-Artikel (auf BMP-Basis) irgendwo im Wiki.


Zuletzt geändert von waran am Sa Aug 01, 2009 09:46, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 09:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Danke für deine schnelle Antwort:

doch leider - ich weis nicht warum - in meinem Code steht's richtig drinn:

Hier nochmal der Code:
Code:
  1.  
  2. procedure AbGlDrawMatrix(Matrix: PGLfloat; X, Y, Z: TGLfloat; AFont: TAbGlFont; ClientWidth, ClientHeight: Integer);
  3. var
  4.   I: Integer;
  5.   J: Integer;
  6. begin
  7.   glPushMatrix;        { save current modell matrix to stack }
  8.   glTranslatef(X,Y,Z); { move to matrix output position }
  9.  
  10.   glMatrixMode(GL_PROJECTION); { switch to projection matrix }
  11.   glPushMatrix;                { save projection matrix to stack }
  12.  
  13.   glLoadIdentity;              { reset projection matrix }
  14.   glOrtho(0,ClientWidth,0,ClientHeight, -1.01, 1.01); { set orthogonal perspective }
  15.  
  16.   glMatrixMode(GL_MODELVIEW);  { switch to model matrix }
  17.   glDisable(GL_DEPTH_TEST);    { disable the depth buffer }
  18.  
  19.   // nur zu debug zwecken hier eingefügt
  20.   //========================
  21.   for I := 0 to ClientWidth do
  22.   begin
  23.      glBegin(GL_LINE_STRIP);
  24.        glVertex2f(I,0);
  25.        glVertex2f(I+1,ClientHeight);
  26.      glEnd;
  27.   end;
  28.   //========================
  29.  
  30.   // do the job
  31.   for I := 0 to 3 do
  32.     for J := 0 to 3 do
  33.     begin
  34.       AFont.DrawText3f('a' + IntToStr(I) + IntToStr(J) + ': '
  35.                            + FormatFloat('0.00',
  36.                              Matrix[I*4+J]),       { print matrix values }
  37.                                     I * 1 ,        { calc x output pos }
  38.                                     J * - 3 , Z);  { calc y output pos }
  39.     end;
  40.  
  41.   glEnable(GL_DEPTH_TEST);      { enable the depth buffer }
  42.  
  43.   glMatrixMode(GL_PROJECTION);  { switch to projection matrix }
  44.   glPopMatrix;                  { restore old perspcetiv matrix from stack }
  45.  
  46.   glMatrixMode(GL_MODELVIEW);   { switch to model matrix }
  47.   glPopMatrix;                  { restore old modell matrix }
  48. end;            
  49.  


Muss ein Fehler beim Erstellen der Antwort gewesen sein.

Und:

Zitat:
Ich zitiere aus dem Wiki: "glOrtho erstellt eine Matrix für Parallel-Projektion. Die aktuelle Matrix wird dabei mit der neu erstellten Matrix multipliziert.".
D.h. dadurch, dass du das LoadIdentity vergessen hast, ruinierst du mit glOrtho deine Matrix.


Jup, den Teil habe auch gelesen als M := M*O , wenn M die aktuelle Matrix ist und O die Orthogonale, dann zerschieße ich mir die aktuelle Projektionsmatrix. Deswegen habe ja Punkt 4 ) eingefügt, einfach :weird:

Aber was mich an der erkärung zu glOrtho verwirrt ist die Aussage:
Zitat:
glOrtho erstellt eine Matrix für Parallel-Projektion. Die aktuelle Matrix wird dabei mit der neu erstellten Matrix multipliziert...

Was ist M? Die aktuelle Modellmatrix? Die Projektionsmatrix? Oder keins von beidem? Und wenn es die Modellmatrix ist, warum multipliziert sich die Orthonale dann gleich mit rein? Speichert die Modellmatrix das dann verlustfrei für jede weitere Manipulation? Von der Rotation weis ich es ja bereits - dort wirkt es dann wie eine Art Variable für die getrennte Rotation je Achse auf drei Achsen.

Sorry für die blöden Fragen!

Zum Bitmap: Ich habs mir ja fast schon gedacht :) Ich denke ich werde es mit einem Bitmap-Header machen und glReadPixels, thx!

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


Zuletzt geändert von DeepCopy am Sa Aug 01, 2009 09:59, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 09:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Zitat:
Code:
  1. glTranslatef(X,Y,Z); { move to matrix output position }


Mhhm. Ist das bewusst eine relative Position?
Ansonsten müsste davor auch noch ein glLoadIdentity.

Was mir sonst noch "komisch" auffällt ist, dass du zwar eine Projektion definierst, die über
die ganze Bildschirmgröße geht (also Screen-Pixel : GL-Koordinaten = 1:1) aber deine Zeichenfunktion
dann mit so kleinen Werten wie 2.0 aufrufst (= 2 Pixel auf dem Schirm).

Die Vertices werden erst beim Rendern mit der Pojektionsmatrix multipliziert. Also macht es keinen
Unterschied, ob du die Vertices "unter der alten Projektionsmatrix" verschiebst - die Anderungen mit
glTranslate betreffen ja nur die ModelView-Matrix.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 10:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Das mit den keinen Werten habe ich zu Debug-Zwecken so gemacht, wird dann noch geändert - die Fontgröße ist dann die Zeilen- und Spaltenabstandskonstante.

Aber selbst dann, warum wird eine Ausgabe von GL_LINE_STRIP nicht angezeigt?

Eine Ahnung: Kann es sein das ich die Modellmatrix wieder in den Ursprung zurücksetzen muss um eine Anzeige zu bekommen?

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


Zuletzt geändert von DeepCopy am Sa Aug 01, 2009 10:18, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 10:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Danke das wars!

Zitat:
Mhhm. Ist das bewusst eine relative Position?
Ansonsten müsste davor auch noch ein glLoadIdentity.


Das ist mir beim Experimentieren nicht aufgefallen weil ich die Linien so eng gezogen habe das ich "NUR" einen weissen Hintergrund erzeugt habe, erst mit deinem Hinweis bin ich nochmal an die Stelle gegangen, habe GL_LINE_STRIP rausgeschmissen und voilá da hatte ich wieder meine Hintergrundfarbe, der Rest war dann auch simple.

Aber trotzdem bleibt bei mir noch die Verständnisfrage nach M:=M*O offen, ist M die Modellmatrix? Und wenn ja wie habe ich das zu verstehen?

Dickes THX! :D

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 10:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Aber trotzdem bleibt bei mir noch die Verständnisfrage nach M:=M*O offen, ist M die Modellmatrix? Und wenn ja wie habe ich das zu verstehen?

M ist die aktuelle Matrix des aktuellen Matrix-Modus. Wenn du also vorher glMatrixMode(GL_PROJECTION) gesetzt hast, ist es die aktuelle Projektionsmatrix.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 10:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 18, 2009 07:17
Beiträge: 44
Wohnort: Gießen/Hessen
Also wird bei einem Aufruf von

glMatrixMode(GL_MODELVIEW) - die Modellmatrix,
glMatrixMode(GL_PROJECTION) - die Projektionsmatrix,
glMatrixMode(GL_TEXTURE) - die Texturenmatrix,
glMatrixMode(GL_COLOR) - die Farbmatix,

und einem anschließenden Aufruf von glOrtho, manipuliert?

Was für einen Sinn hat glOrtho bei der Modell, und Farbmatrix?

_________________
Gruß Andreas (aka DeepCopy) - Sic Luceat Lux

Classified Directive: initialization write in function for finalization, repeat until public case uses begin, if not case type as default, var in virtual override for while, in case of class type type asm until read begin.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 10:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ja.

glOrtho ist nichts weiter als eine Skalierung mit anschließender Translation. Könnte also bei Modelview durchaus noch irgendwie Sinn machen. Wenn du z.B. irgendwann keine 3D-Grafik mehr rendern willst, sondern was ganz anderes machen möchtest, kann so etwas möglicherweise auch bei der Color-Matrix Sinn machen....

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Aug 01, 2009 16:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
du setzt deine ModelViewMatrix nach dem aktivieren nicht zurück.

_________________
Klar Soweit?


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: Bing [Bot] und 2 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.

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