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?
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.
die class-procedure für das Quad (mit dem Quick-Fix für das Tiefentestproblem)
Code:
//Einheitsquadrat in der x-z-Ebene mit (0,0,0) als Mittelpunkt
classprocedure TRenderable.renderEinheitsQuad(doppel :Boolean; rahmen :Boolean);
begin
glBegin(GL_QUADS);
glVertex3f(0.5,0.5,0);// Top Right Of The Quad (Front)
glVertex3f(-0.5,0.5,0);// Top Left Of The Quad (Front)
glVertex3f(-0.5,-0.5,0);// Bottom Left Of The Quad (Front)
glVertex3f(0.5,-0.5,0);// Bottom Right Of The Quad (Front)
glEnd;
if doppel=truethen
begin
glBegin(GL_QUADS);
glVertex3f(0.5,-0.5,0);// Bottom Right Of The Quad (Front)
glVertex3f(-0.5,-0.5,0);// Bottom Left Of The Quad (Front)
glVertex3f(-0.5,0.5,0);// Top Left Of The Quad (Front)
glVertex3f(0.5,0.5,0);// Top Right Of The Quad (Front)
glEnd;
end;
//Rahmen
if rahmen=truethen
begin
glDisable(GL_DEPTH_TEST);
glColor3f(1,1,1);
glLineWidth(2);
glBegin(GL_LINES);
glVertex3f(0.5,-0.5,0);// Bottom Right Of The Quad (Front)
glVertex3f(-0.5,-0.5,0);// Bottom Left Of The Quad (Front)
glVertex3f(-0.5,-0.5,0);// Bottom Left Of The Quad (Front)
glVertex3f(-0.5,0.5,0);// Top Left Of The Quad (Front)
glVertex3f(-0.5,0.5,0);// Top Left Of The Quad (Front)
glVertex3f(0.5,0.5,0);// Top Right Of The Quad (Front)
glVertex3f(0.5,0.5,0);// Top Right Of The Quad (Front)
glVertex3f(0.5,-0.5,0);// Bottom Right Of The Quad (Front)
glEnd;
glLineWidth(1);
glEnable(GL_DEPTH_TEST);
end;
end;
der aufrufende Code:
Code:
procedure TWand.render;
begin
translatef(position);
rotatef(winkel);
glScalef(breite,hoehe,1);
farbe.setGLColor;
renderEinheitsQuad(false,true);
end;
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.
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.
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.
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.