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

Aktuelle Zeit: Do Jul 10, 2025 03:08

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit glOrtho
BeitragVerfasst: Mi Mai 20, 2009 12:14 
Offline
DGL Member

Registriert: Di Mai 12, 2009 14:32
Beiträge: 24
Hallo mal wieder!

Eigentlich ist es ja einfach, aber irgendwas stimmt einfach nicht! Ich zeichne zunächst alle Objekte im glPerspective-Modus, dann schalte ich um und möchte (pixelgenau) ein HUD darüber zeichnen. Dazu schalte ich zunächst die Projektionsmatrix um und zeichne danach das HUD:

Code:
  1.   //2D - glOrtho --->
  2.   glMatrixMode(GL_PROJECTION);
  3.   glLoadIdentity;
  4.   glViewport(0,0,Resolution_W,Resolution_H);
  5.   glOrtho(0,Resolution_W,0,Resolution_H,-100,100);
  6.   glMatrixMode(GL_MODELVIEW);
  7.   glLoadIdentity;  
  8.   glEnable(GL_BLEND);
  9.   glEnable(GL_TEXTURE_2D);
  10.   Hud.Draw;




Code:
  1. procedure THud.Draw;
  2. var i : integer;
  3. begin
  4.   for i := 0 to length(elements) - 1 do begin
  5.     elements[i].Draw;
  6.   end;
  7. end;
  8.  
  9. procedure THudElement.Draw;
  10. var i : integer;
  11. begin
  12.   glpushmatrix;
  13.   gltranslatef(pos.x,pos.y,pos.z);
  14.   glcolor3f(1,1,1);
  15.   glBindTexture(GL_TEXTURE_2D,texture);
  16.   glBlendFunc(GL_SRC_Alpha,GL_ONE_MINUS_SRC_ALPHA);
  17.   glbegin(GL_QUADS);
  18.  
  19.     gltexcoord2f(0,0); glvertex3f(pos.x,pos.y+height,pos.z);
  20.     gltexcoord2f(0,1); glvertex3f(pos.x, pos.y, pos.z);
  21.     gltexcoord2f(1,1); glvertex3f(pos.x+width,pos.y,pos.z);
  22.     gltexcoord2f(1,0); glvertex3f(pos.x+width,pos.y+height,pos.z);
  23.  
  24.  
  25.    
  26.   glend;
  27.   glpopmatrix;
  28.   for I := 0 to length(hudtext) - 1 do begin
  29.     with hudtext[0] do begin
  30.       glpushmatrix;
  31.       gltranslatef(pos.x,pos.y,pos.z);
  32.       glrotatef(180,1,0,0);
  33.       glscalef(scale,scale,scale);
  34.       tsFontBind(Fonts[2]);
  35.       glBlendFunc(GL_SRC_Alpha  ,GL_ONE_MINUS_SRC_ALPHA);
  36.       tsTextOutA(pchar(text));
  37.       glpopmatrix;
  38.     end;
  39.   end;
  40.  
  41. end;


Doch die Koordinaten stimmen seltsamerweise nicht. Ich arbeite bei einer Auflösung von 1280x1024 (LCD), aber wenn ich z.B. als Koordinaten (0,512) nehme, bni ich am oberen Bildschirmrand, obwohl dort ja eig. die Koordinate (0,1024) sein sollte. Was habe ich falsch gemacht? Liegt es daran dass ich zuerst die 3 dimensionale Projektionsmatrix benutze? Was muss ich beim Umschalten beachten? :?:

_________________
--
Christian


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 20, 2009 12:28 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Okt 04, 2006 15:42
Beiträge: 78
Wohnort: Bonn
Programmiersprache: Python, C++, Delphi
Zitat:
Liegt es daran dass ich zuerst die 3 dimensionale Projektionsmatrix benutze?

Daran liegt es ganz sicher nicht, da du die Matrix durch den Aufruf von glLoadIdentity zurücksetzt.

Du musst glOrtho nicht wirklich genaue Pixelkoordinaten geben, da es sich hier nur um einen
virtuellen Maßstab handelt - wichtig ist, dass das Seitenverhältnis stimmt. Du kannst z.B. wenn
du glOrtho die Auflösung 640x480 gibst auch reell 1024x768 haben - das spielt dann aber für
deine Arbeit in OpenGL keine Rolle.

Welche Werte haben denn die Variablen "Resolution_W" und "Resolution_H" - die Auflösung deines
Monitors?
Ich würde testweise den Aufruf von glViewport herausnehmen. Ich sehe eigentlich nicht, wofür er
an dieser Stelle gut sein soll - kann also nur Ärger machen :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 20, 2009 12:35 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Was mich auch stutzig macht :

Code:
  1. gltranslatef(pos.x,pos.y,pos.z);
  2. ...
  3.   glbegin(GL_QUADS);
  4.     gltexcoord2f(0,0); glvertex3f(pos.x,pos.y+height,pos.z);
  5. ...


Du verschiebst ja dein Objekt bereits an seine Position, und tust dann quasi das selbe nochmal bei der Angabe der Eckpunkte. Deine Position wird also verdoppelt.

Ausserdem liegt der Ursprung bei OpenGL unten links, nicht oben links wie bei Windows, also sollte auch glOrtho angepasst werden :
Code:
  1. glOrtho(0, Resolution_W, Resolution_H, 0, -100, 100);

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


Zuletzt geändert von Sascha Willems am Mi Mai 20, 2009 16:54, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 20, 2009 16:41 
Offline
DGL Member

Registriert: Mi Mai 06, 2009 15:57
Beiträge: 13
Sascha Willems hat geschrieben:
Was mich auch stutzig macht :

Ausserdem liegt der Ursprung bei OpenGL unten links, nicht oben rechts wie bei Windows, also sollte auch glOrtho angepasst werden :
Code:
  1. glOrtho(0, Resolution_W, Resolution_H, 0, -100, 100);


Womit der Ursprung aber oben links wäre.
Sein glOrtho war schon richtig so.

Aber wie Waran schon fragte wäre es gut zu wissen wie die Resulotion_H und W Werte sind.

Nachtrag:
Obwohl, Saschas Einwand macht natürlich Sinn. Wenn du erst ein translate machst (sagen wir mal um 512 auf y-Achse) und danach das Quad nochmals mit absoluten Koordinaten angibst (wieder y-Wert 512) .... dann biste eben am oberen Bildschirmrand :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 14:40 
Offline
DGL Member

Registriert: Di Mai 12, 2009 14:32
Beiträge: 24
:shock: Natürlich! Ach bin ich so blind xD Und ich such da ewig und probier Stunden rum....Danke für den Hinweis! :o

_________________
--
Christian


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]