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

Aktuelle Zeit: Fr Jul 18, 2025 15:55

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problemen mit dem Tiefentest
BeitragVerfasst: Mi Feb 22, 2006 10:45 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Hallo,

Ich hab ein Problem mit dem Tiefentest. Meine Depth-Func ist GL_LEQUAL und ich will folgendes Zeichnen:

1. ein einfarbiges Quad (mittels glBegin(GL_QUAD) glVertex3f ... glEnd;)
2. einen Rahmen auf das Quad (mittels glBegin(GL_LINES) ... glEnd;)

ich Zeichne zuerst das Quad, dann den Rahmen mit den Eck-Koordinaten des Quads (4 Vertex-Paare).
Leider wird dann der Rahmen nicht angezeigt weil er durch den Tiefentest fällt. Momentan behelfe ich mich damit, dass
ich den Tiefentest für den Rahmen abschalte, was aber bei Quadern später keine Lösung ist.

Was mache ich falsch? bzw. wie kann ich das Problem lösen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 22, 2006 11:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Also bei mir hat das bisher immer so funktioniert. Evtl wäre mal ein bisschen Code nicht schlecht. Vielleicht hast du ja etwas übersehen.

Eine andere Alternative ist glPolygonOffset. Allerdings ist die Anpassung der Tiefenfunc die saubere und schönere Alternative. Das Polygon Offset sieht mal leider.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Feb 22, 2006 12:56 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
Hier ein bischen Code (es ist schwierig, da er sich über relativ viele Klassen spannt)

Der Setup-Code für OpenGL
Code:
  1.  
  2. procedure TFrame1.SetupGL;
  3. begin
  4.   glClearColor(0,0,0,0);
  5.   glClearDepth(1.0); // Depth Buffer Setup
  6.   glEnable(GL_DEPTH_TEST); // Enables Depth Testing
  7.   glDepthFunc(GL_LEQUAL); // The Type Of Depth Test To Do
  8.   glEnable(GL_CULL_FACE); //enable backface-culling
  9.  
  10.   //glHint(GL_LINE_SMOOTH,GL_NICEST);
  11.   glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
  12. end;
  13.  


die class-procedure für das Quad (mit dem Quick-Fix für das Tiefentestproblem)
Code:
  1.  
  2. //Einheitsquadrat in der x-z-Ebene mit (0,0,0) als Mittelpunkt
  3. class procedure TRenderable.renderEinheitsQuad(doppel : Boolean; rahmen : Boolean);
  4. begin
  5.   glBegin(GL_QUADS);
  6.     glVertex3f( 0.5, 0.5, 0); // Top Right Of The Quad (Front)
  7.     glVertex3f(-0.5, 0.5, 0); // Top Left Of The Quad (Front)
  8.     glVertex3f(-0.5,-0.5, 0); // Bottom Left Of The Quad (Front)
  9.     glVertex3f( 0.5,-0.5, 0); // Bottom Right Of The Quad (Front)
  10.   glEnd;
  11.   if doppel=true then
  12.   begin
  13.     glBegin(GL_QUADS);
  14.       glVertex3f( 0.5,-0.5, 0); // Bottom Right Of The Quad (Front)
  15.       glVertex3f(-0.5,-0.5, 0); // Bottom Left Of The Quad (Front)
  16.       glVertex3f(-0.5, 0.5, 0); // Top Left Of The Quad (Front)
  17.       glVertex3f( 0.5, 0.5, 0); // Top Right Of The Quad (Front)
  18.     glEnd;
  19.   end;
  20.   //Rahmen
  21.   if rahmen=true then
  22.   begin
  23.     glDisable(GL_DEPTH_TEST);
  24.     glColor3f(1,1,1);
  25.     glLineWidth(2);
  26.     glBegin(GL_LINES);
  27.       glVertex3f( 0.5,-0.5, 0); // Bottom Right Of The Quad (Front)
  28.       glVertex3f(-0.5,-0.5, 0); // Bottom Left Of The Quad (Front)
  29.  
  30.       glVertex3f(-0.5,-0.5, 0); // Bottom Left Of The Quad (Front)
  31.       glVertex3f(-0.5, 0.5, 0); // Top Left Of The Quad (Front)
  32.  
  33.       glVertex3f(-0.5, 0.5, 0); // Top Left Of The Quad (Front)
  34.       glVertex3f( 0.5, 0.5, 0); // Top Right Of The Quad (Front)
  35.  
  36.       glVertex3f( 0.5, 0.5, 0); // Top Right Of The Quad (Front)
  37.       glVertex3f( 0.5,-0.5, 0); // Bottom Right Of The Quad (Front)
  38.     glEnd;
  39.     glLineWidth(1);
  40.     glEnable(GL_DEPTH_TEST);
  41.   end;
  42. end;
  43.  


der aufrufende Code:
Code:
  1.  
  2. procedure TWand.render;
  3. begin
  4.   translatef(position);
  5.   rotatef(winkel);
  6.   glScalef(breite,hoehe,1);
  7.   farbe.setGLColor;
  8.   renderEinheitsQuad(false,true);
  9. end;
  10.  

die Prozeduren translatef, rotatef sind einfach Umsetzungen von TPosition und TWinkel auf die glTranslatef und glRotatef Funktionen von OGL.
farbe ist vom Typ her eine Klasse die RGBA-Werte speichert. setGLColor ruft dann glColor4f mit den entsprechenden Werten auf.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 09:53 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Sieht eigentlich okay aus. Hmmm. Kann auch sein, dass ich nen Gedankenfehler hatte. Musste mal schauen, dass du es mal mit PolygonOffset probierst. Das ist ja eigentlich für so was gut.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
tust du den Tiefenpuffer auch löschen? Weil mit glClearDepth legst du nur den Wert fest, mit dem er gelöscht werden soll.

Code:
  1. glClear(GL_COLOR_BUFFER_BIT or      //Farb-Puffer löschen
  2.         GL_DEPTH_BUFFER_BIT);       //Tiefenpuffer löschen

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 13:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Das Problem ist dabei eher das, dass es ja funktioniert. Allerdings nur wenn die Fläche der Linien planar zur Fläche sind. Also wenn man vorne auf die Fläche schaut. Wenn man jetzt ein bisschen den Blickwinkel andert, dann schaut die Linie immer zum Betrachter (ala Sprites). Das fällt besonders stark auf, wenn man mal eine Linienstärke von 10 oder so hat. Dadurch bekommt sie aber auf der einen Seite einen kleineren und auf der anderen einen höheren ZWert. Denke aber schon, dass dadurch microskopisch kleine Abweichungen im ZBuffer auftreten und somit der Tiefentest praktisch unwirksam gemacht wird. Ich denke mal OpenGL ist auch so genau, dass dieses Problem auch bei 1 Pixel zum Tragen kommt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Feb 23, 2006 14:35 
Offline
DGL Member

Registriert: Mo Jan 16, 2006 22:00
Beiträge: 24
ja, ich lösche auch den Tiefenbuffer - das glClear wird in einem anderen Code den ich nicht zitiert habe ausgeführt.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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.008s | 14 Queries | GZIP : On ]