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)
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:
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
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)
{------------------------------------------------------------------} { 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.
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.
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:
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.
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
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 network • my 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
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)
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
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.