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

Aktuelle Zeit: So Jun 09, 2024 01:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: [gelöst] HUD wird nicht angezeigt
BeitragVerfasst: So Mär 07, 2010 20:18 
Offline
DGL Member
Benutzeravatar

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

ich hoffe ihr könnt einem Hobby Delphi Programmierer weiterhelfen. Ich bin OpenGL Neuling und versuche ein HUD in meine Anwendung zu bauen. Die letzten Tage habe ich mich durch mehrere Seiten gelesen, verschiedene Ansätze ausprobiert, nochmals die Theorie aus den Tutorials studiert, bin aber leider zu keinem brauchbaren Ergebnis gekommen. Stand der Dinge ist, dass ich (zu hoffe ich zumindest) von dem 3D in den 2D Modus schalten kann. Allerdings werden die Zeichenanweisungen ignoriert. Ich sehe zwar meine 3D Landschaft, aber von meinem Quadrat fehlt jede Spur.

Meine Prozeduren lauten wie folgt (der gesamte Quelltext ist auch an dieses Posting angefügt - macht es vielleicht einfacher).
{------------------------------------------------------------------}
{ Toggles to 2D mode }
{------------------------------------------------------------------}
procedure glSwitchTo2D;
begin
glDisable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0, 800, 0, 600, -1000, 1000);
glMatrixMode(GL_MODELVIEW);
glPushMatrix;
glLoadIdentity();
end;


{------------------------------------------------------------------}
{ Toggles back to 3D mode }
{------------------------------------------------------------------}
procedure glSwitchTo3D;
begin
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
end;


{------------------------------------------------------------------}
{ Draws the HUD - experimental }
{------------------------------------------------------------------}
procedure glDrawHUD;
begin
glSwitchTo2D;
glBindTexture(GL_TEXTURE_2D, Texture[0]); //Dummy texture
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0,1);
glVertex2f(1,1);
glVertex2f(1,0);
glEnd;
glSwitchTo3D;
end;


Kann mir jemand sagen, wo der Fehler liegt?


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  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: So Mär 07, 2010 20:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also ich sehe da, dass bei glSwitchTo3D ein glPopMatrix fehlt, was irgendwann zu einem Stackoverflow führen wird.

Der Grund warum du nichts siehst ist glaube ich das dein Quad was du da renderst kleiner als ein Pixel ist. Die Vertexkoordinaten müssten von 0 bis 800 (bzw. 600) gehen, nicht nur von 0 bis 1. Versuch's mal mit dem hier:
Code:
  1. glOrtho(0, 1, 0, 1, -1, 1);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: So Mär 07, 2010 20:47 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Naja... ich finde es ist besser Pixelgenau zu zeichnen. Also wie bisher glOrtho mit 800x600 (bei der Tiefe solltest du bei 0.01 beginnen, nicht mit Negativen Werten arbeiten) und dann deine Vertexkoordinaten entpsrechend anpassen. (Du kannst dann Pixel genau Koordinaten angeben). Siehe auch unser 2D Tutorial.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: So Mär 07, 2010 21:55 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
Zunächst einmal vielen Dank für die schnellen Antworten.

Den fehlenden glPopMatrix Befehl habe ich ergänzt und auch den Tipp mit den positiven Tiefenwerten im glOrtho übernommen. Des Weiteren habe ich testweise das zu zeichnende Objekt vergrößert. Leider erscheint immer noch nichts auf dem Bildschirm (testweise habe ich das Objekt auf 800x600 gesetzt, um sicher zu gehen).

Aus dem Tutorial (das ich übrigens sehr logisch finde) habe ich den Quellcode übernommen und angepasst (obwohl er sich nicht viel von dem jetzigen unterschied), aber leider ohne positives Ergebnis.

Ich verstehe nicht, wohin mein Rechteck verschwindet. Überzeichnet wird es vermutlich nicht - wenn ich die 3D Zeichenroutine auskommentiere sehe ich es trotzdem nicht.

_________________
Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 01:09 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Aus meiner Sicht sind die Hauptverdächtigen diese beiden Programmstellen:

1. Umschalten auf 2D-Modus

Zitat:
{------------------------------------------------------------------}
{ Toggles to 2D mode }
{------------------------------------------------------------------}
procedure glSwitchTo2D;
.......
glOrtho(0, 800, 0, 600, -1000, 1000);



2. Zeichnen des Quad

Zitat:
{------------------------------------------------------------------}
{ Draws the HUD - experimental }
{------------------------------------------------------------------}
procedure glDrawHUD;
begin
glSwitchTo2D;
glBindTexture(GL_TEXTURE_2D, Texture[0]); //Dummy texture
glBegin(GL_QUADS);
glVertex2f(0,0);
glVertex2f(0,1);
glVertex2f(1,1);
glVertex2f(1,0);



Du weißt sicher, dass in OpenGL in der Grundeinstellung (wo der Koordinatenursprung LINKS UNTEN angenommen wird) alle Primitiven GEGEN den Uhrzeigersinn gezeichnet werden. Diese Einstellung lässt sich per glOrtho ändern, indem man Top und Bottom vertauscht.

Ein kurzer Blick auf glOrtho zeigt, dass Du an der OpenGL-Grundeinstellung nichts änderst, aber dass Du das Quad im Uhrzeigersinn zeichnest, also genau falsch herum. Wenn Du daher Backface-Culling eingeschaltet hast:

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

Dann wird Dein Quad fälschlich als "BackFace" angesehen und daher "gecullt", also nicht gezeichnet.

Mögliche Abhilfen:
*** entweder Top und Bottom im glOrtho vertauschen (=> Koordinatenursprung LINKS OBEN, das ist der Windows-Standard) oder
*** Quad gegen den Uhrzeigersinn zeichnen.

Viele Grüße,
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 01:10 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Blöde Frage: Ist dein Viewport im 2D-Modus gesetzt? Das vergess ich regelmässig und wundere mich dann, warum ich nichts sehe. Kostet mich im Schnitt 30 Minuten Fehlersuche und ich ärgere mich am Ende maßlos.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 12:00 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

du kannst auch zum Testen das CullFace erstmal komplett aus machen. Außerdem schalt ich beim 2D-Zeichnen auch immer den TiefenTest aus, da es da auch manchmal zu Problemen kommt. Die Zeichenreihenfolge leg ich dann selbst fest...
Und noch ein kleiner Tipp. Wenn du beim Switch auf 2D dem glOrtho deinen Viewport übergibst musst du ncih jedesmal die Werte ändern, fals sich die Größe des Viewports ändert, und du bist trotzdem noch Pixelgenau.
Hier mal ne Methode die einen Hintergrund Zeichent, wenn du das Löschen des TiefenBuffers am Ende weg lässt, dann solltest du das haben was du sucht:
Code:
  1. procedure DrawBackground;
  2. var Viewport: TVector4i;
  3. begin
  4.   glGetIntegerv(GL_VIEWPORT, @Viewport[0]);       //ViewPort speichern
  5.  
  6.   glMatrixMode(GL_PROJECTION);                    //in die ProjektionsMatrix
  7.   glPushMatrix;                                   //Matrix speichern
  8.   glLoadIdentity;                                 //Matrix zurücksetzen
  9.   glOrtho(0, Viewport[2], Viewport[3], 0, 0, 10); //2D-Sicht festlegen (mit Viewport als Grenzen)
  10.  
  11.   glMatrixMode(GL_MODELVIEW);                     //in die ModelMatrix
  12.   glPushMatrix;                                   //Matrix speichern
  13.   glLoadIdentity;                                 //Matrix zurücksetzen
  14.  
  15.   glBegin(GL_QUADS);                              //Hintergrund Zeichnen
  16.     glColor3f(1,0,0); glVertex2f(          0,           0);
  17.     glColor3f(0,1,0); glVertex2f(          0, ViewPort[3]);
  18.     glColor3f(0,0,1); glVertex2f(ViewPort[2], ViewPort[3]);
  19.     glColor3f(1,1,0); glVertex2f(ViewPort[2],           0);
  20.   glEnd;
  21.  
  22.   glMatrixMode(GL_PROJECTION);                    //in die ProjektionsMatrix
  23.   glPopMatrix;                                    //alte Matrix wieder laden
  24.  
  25.   glMatrixMode(GL_MODELVIEW);                     //in die ModelMatrix
  26.   glPopMatrix;                                    //alte Matrix wieder laden
  27.  
  28.   glClear(GL_DEPTH_BUFFER_BIT);                   //Tiefenbuffer löschen
  29. end;


MfG Bergmann

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
Ich habe meinen Code angepasst und auch die hier genannten Vorschläge ausprobiert. Leider alles ohne wirklichen Erfolg.

Was ich nicht verstehe ist, dass (zumindest so wie ich es sehe) mein Code mit dem von Bergmann89 identisch ist (bis auf die Anweisungen um GL_DEPTH_TEST) und es trotzdem nicht funktioniert. Mein Code sieht im Moment so aus.

Code:
  1. {------------------------------------------------------------------}
  2. {  Toggles to 2D mode                                              }
  3. {------------------------------------------------------------------}
  4. procedure glSwitchTo2D;
  5. begin
  6.   glDisable(GL_DEPTH_TEST);
  7.   glMatrixMode(GL_PROJECTION);
  8.   glPushMatrix();
  9.   glLoadIdentity();
  10.   glOrtho(0, 800, 0, 600, 0.01, 1000);
  11.   glMatrixMode(GL_MODELVIEW);
  12.   glPushMatrix;  
  13.   glLoadIdentity();
  14. end;
  15.  


Code:
  1. {------------------------------------------------------------------}
  2. {  Toggles back to 3D mode                                         }
  3. {------------------------------------------------------------------}
  4. procedure glSwitchTo3D;
  5. begin
  6.   glEnable(GL_DEPTH_TEST);
  7.   glMatrixMode(GL_PROJECTION);
  8.   glPopMatrix();
  9.   glMatrixMode(GL_MODELVIEW);
  10.   glPopMatrix();
  11. end;


Code:
  1. {------------------------------------------------------------------}
  2. {  Draws the HUD - experimental                                    }
  3. {------------------------------------------------------------------}
  4. procedure glDrawHUD;
  5. begin
  6.  
  7.   glViewport(0, 0, 800,600);                   //Set Viewport to cover full window
  8.  
  9.   glSwitchTo2D;
  10.   glBindTexture(GL_TEXTURE_2D, Texture[0]);    //Dummy texture
  11.   glBegin(GL_QUADS);                           //Draw Quad counter clockwise
  12.     glVertex2f(-10,-10);
  13.     glVertex2f(10,-10);
  14.     glVertex2f(10,10);
  15.     glVertex2f(-10,10);
  16.   glEnd;
  17.   glSwitchTo3D;
  18. end;


Ich habe den aktuellen Source Code angehängt, da es vielleicht einfach ist, das Ganze Konstrukt zu sehen/ zu kompilieren.


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  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 17:40 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Drei Vorschläge:

1. Mach die Koordinaten größer und rück das mehr ins Zentrum. Also 200,200 - 400,400
2. deaktiviere die Texturen. Wenn du eine "Dummitextur" verwendest und die Bindest, kann das Quad durchaus auch schwarz sein.
3. Setze die Hintergrundfarbe auf eine Farbe die garantiert nicht in deiner Szene vorkommt. Also sowas wie (0.5,0.5,0.75)

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 17:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Bei deinem glOrtho-Aufruf setzt du als minimale Tiefe 0.01 und als maximale Tiefe 1000. glVertex2f verwendet aber standardmäßig z=0, dein Quad sollte also einfach durch den Test fallen und nicht gezeichnet werden. Bei glOrtho kannst du ohne Probleme auch negative Werte für die minimale Tiefe nehmen (ich nehme meist -10 bis 10).

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 17:50 
Offline
DGL Member
Benutzeravatar

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

ich habe die drei Vorschläge ausprobiert, aber Ergebnis ist das gleiche (abgesehen davon, dass die Hintergrundfarbe nicht mehr schwarz ist).

Es ist wirklich seltsam - ich habe jetzt schon aus Ideen aus vielen verschiedenen Tutorials ausprobiert, aber aus irgendeinem Grund kommt es bei mir nicht zur Anzeige.

_________________
Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
Lord Horazont,

Du hast Dir eben ein Bier verdient (ein virtuelles oder Du kommst es Dir in Zürich abholen).

Vielen Dank!

_________________
Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 17:56 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7804
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja, das war mein Fehler. Negative z-Buffer verwende ich nicht, und da ich mal vor langer Zeit gehört habe, dass "0" als z-Bufferwert wohl ungünstig sein kann (keine Ahnung warum) wollte ich dir ne "sorgenfreie" Lösung vorschlagen. Das war wohl nix. ;)
Sorry.
Aber die anderen Vorschläge sollten trotzdem nicht daneben gewesen sein.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 19:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Mär 07, 2010 18:40
Beiträge: 33
Hi Flash,

kein Problem - ich bin für jede Idee dankbar!

_________________
Wissen nennen wir jenen kleinen Teil der Unwissenheit, den wir geordnet und klassifiziert haben. (Ambrose Bierce)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: HUD wird nicht angezeigt
BeitragVerfasst: Mo Mär 08, 2010 19:14 
Offline
DGL Member

Registriert: Mo Aug 31, 2009 13:19
Beiträge: 151
Erm...versteh ich das richtig? Es klappt jetzt?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 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.148s | 15 Queries | GZIP : On ]