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

Aktuelle Zeit: Di Jul 15, 2025 12:54

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Tiefenbuffer & Ortho-Mode
BeitragVerfasst: Mo Mär 24, 2008 22:44 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 19:29
Beiträge: 38
Hallo, ich mal wieder ;-)
Ich habe das Problem, dass ich im Ortho-Mode die Reihenfolge meiner gezeichneten Quads nicht festlegen kann. Sobald ich den Quads irgendeinen andren Wert als 0 zuweise rendert er alles nurnoch schwarz. Umgangen bin ich das Problem die ganze Zeit, indem ich alles auf 0 gesetzt habe und eben in der entsprechenden Reihenfolge nach und nach gerendert habe.
Aber jetzt kam noch erschwerend hinzu, dass ich auch noch darauf achten muss, in welcher Reihenfolge ich den Code zusammensetze. So wird das UI nicht angezeigt, wenn ich es nach dem Zeichnen des Charakters zeichne (obwohl die sich überhaupt nicht überlagern).
Einzigste Ausnahme ist die Map. (Man muss sich das ganze so vorstellen: 1. Layer = unten ==> gras, wege, usw.; 2. Layer = mitte => NPCs; 3. Layer = oben => Spieler; 4. Layer = ganz oben => User-Interface). Die Map muss -1 haben, sonst wird alles was obendrüber ist, nicht gezeichnet.

Ist mal wieder so ne Sache, die ich garnicht erklären kann, weil ich nicht den Hauch einer Ahnung habe, an was es liegen könnte.
So sieht alles aus, wenn es funktioniert:

edit: bild weg ;)


Sobald ich nun dem Spieler den NPCs den Z-Wert 1 zuweise, dem Spieler den Z-Wert 2 und dem UI den Z-Wert 3 passiert folgendes:
edit: bild weg ;)


In OnCreate habe ich:
Code:
  1. glEnable(GL_DEPTH_TEST);
  2. glDepthFunc(GL_LESS);


Und Ortho hab ich so festgelegt:
Code:
  1.  
  2. procedure TGLForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean);
  3. var
  4.   x,y,i: integer;
  5.   u,v: real;
  6.   CurrentFrame: Cardinal;
  7.   npcBuff: TNPC;
  8. begin
  9. CurrentFrame := GetTickCount;
  10. TimeInterval := CurrentFrame - LastFrame;
  11. // In die Projektionsmatrix wechseln
  12. glMatrixMode(GL_PROJECTION);
  13. // Identitätsmatrix laden
  14. glLoadIdentity;
  15. glViewport(0,0,ClientWidth,ClientHeight);
  16. glOrtho(0, SizeX, SizeY, 0, 0, 128);
  17. // In die Modelansichtsmatrix wechseln
  18. glMatrixMode(GL_MODELVIEW);
  19. // Identitätsmatrix laden
  20. glLoadIdentity;
  21.  



Hoffe ihr könnt mir helfen. Ich such nach dem Problem schon seit 4 Tagen, habs bisher immer ignoriert und eben solange in der Code-Reihenfolge rumprobiert, bis es problemlos ging. Aber langsam nervt es doch und 'ne Lösung dafür finde ich hier im Forum nicht

Gruß Spessi


Zuletzt geändert von Spessi am Mi Mär 26, 2008 22:11, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2008 23:05 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Code:
  1. glDepthFunc(GL_LESS);

GL_LESS? Wäre da nicht GL_GREATER besser?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2008 23:24 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 19:29
Beiträge: 38
Dann ist alles (außer der Text) schwarz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2008 23:40 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Bei welcher Zeichenreihenfolge und welchen Z-Werten?

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 24, 2008 23:45 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 19:29
Beiträge: 38
Hallo,

also, zuerst Zeichne ich den Hintergrund (die Map) bei z=0. Anschließend zeichne ich die NPCs bei z=1. Danach wird der Spieler bei z=2 und das UI bei z=3 gezeichnet.
Am Ende wird der Text gezeichnet (mit der PrintText-Funktion), die beim OpenGL1.5-Template dabei ist).


Gruß

Edit:
Nutze ich
Code:
  1. glDepthFunc(GL_LESS);

wird nur der Hintergrund angezeigt
Nutze ich
Code:
  1. glDepthFunc(GL_GREATER);

ist alles schwarz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 25, 2008 10:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Aug 25, 2005 16:00
Beiträge: 189
Programmiersprache: Java, C#
Ich würd jetzt mal so ganz spontan drauf tippen das Dinge mit Z-Wert größer als 0 nich gezeichnet werden, weil sie hinter dir sind. In dem Fall hättest du dich nicht mithilfe von glTranslatef von der Szene "weg bewegt".

Kann das sein?


edit: was mir noch grad auffällt - bei glOrtho setzt du zNear auf 0. Also ist alles kleiner als auch 0 sowieso böse, weils nich mehr gezeichnet wird... :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 25, 2008 10:55 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Spessi: Die Zeichenreihenfolge in deinem letzten Post klingt für mich schon ziemlich so wie es sein soll. Benötigst du überhaupt einen Tiefentest? Denn wenn du ohne Tiefentest zeichnest spielt nur die Reihenfolge des Zeichnens eine Rolle. Dann würde ein Translate(0, 0, -10) ausreichen um die Zeichenebene ins Sichtfeld zu schieben und beim Zeichnen wäre nur die Reihenfolge entscheidend. Bei 2D ist das aber überhaupt kein Problem.

Wenn du doch einen Tiefentest benötigst gibt es 2 Möglichkeiten. Entweder du gehst von 0 aus und zeichnest alle Objekte mit einem positiven Z Wert. Dann muss die Tiefenfunc aber GEQUAL sein. Also der ZWert muss größer oder gleich sein. Oder aber du erzeugst eine gewisse Grundtiefe (Translate(0, 0, -10)) und zeichnest die Objekte näher an die Kamera (negativer Z Wert (-1, -2 oder -3)). Dann ist der Test LEQUAL. Das Letzte ist für 3D Standard und sollte wenn dann wohl auch für 2D eher verwendet werden.

Nicht desto trotz würde ich dir empfehlen die Z Werte bei glOrtho nicht direkt bei 0 anfangen zu lassen und nicht direkt an einer Kante des Sichtbaren zu zeichnen. Also bei zNear = 1 nicht direkt bei 1 Zeichnen. Sondern eher bei 2 anfangen. Wer weiß schon was es alles für seltsame Hardware gibt. Dann genügen evlt. schon Ungenauigkeiten bei den Datentypen um deine Objekte ins Dunkel zu stürzen und ewig zu binden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mär 25, 2008 15:52 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 19:29
Beiträge: 38
Hallo,
naja gut, hab jetzt beide Methoden von dir ausprobiert: Bild bleibt immer schwarz. Habe dann auch mal den Tiefentest komplett rausgeschmissen und alles auf z=1 gesetzt - tut sich auch nix.

Es geht NUR wenn die Map mit z=-1 gezeichnet wird (OBWOHL mein Bereich nur 0..128 ist! :o) und der rest auf 1 steht und ich eine Reihenfolge einhalte (so muss das User-Interface VOR dem Charakter gezeichnet werden, sonst bleibt es schwarz.


Lossy eX: kann ich dich mal in ICQ adden? Dann könnte ich dir mal den kompletten Code schicken und du könntest 'nen Blick drüber werfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mär 26, 2008 22:10 
Offline
DGL Member

Registriert: Mo Aug 15, 2005 19:29
Beiträge: 38
Ok, also es ging dann letztendlich mit:
Code:
  1. glEnable(GL_DEPTH_TEST);
  2.  
  3. glDepthFunc(GL_LEQUAL);


Code:
  1. glMatrixMode(GL_PROJECTION);
  2. // Identitätsmatrix laden
  3. glLoadIdentity;
  4. // Viewport an Clientareal des Fensters anpassen
  5. glViewport(0,0,1024,768);
  6. glOrtho(0, 1024, 768, 0, -10, 10);
  7.  
  8. // In die Modelansichtsmatrix wechseln
  9. glMatrixMode(GL_MODELVIEW);
  10. // Identitätsmatrix laden
  11. glLoadIdentity;
  12. glTranslatef(0, 0, -10);



Dann konnte ich den einzelnen Quads die passende Z-Werte zuweisen. (Nur damit das Thema hier auch vollständig ist - vielleicht hat ja mal wer das gleiche Problem :-))
Mein Dank geht an Lossy eX (und auch an die anderen, die hier geantwortet haben)


Gruß


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


Wer ist online?

Mitglieder in diesem Forum: Google [Bot] 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 16 Queries | GZIP : On ]