Frage

Hier sind meine Einstellungen für opengl, falls sie wichtig sind:

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

Für eine Weile dachte ich, dass die Schnittebenen für alles gelten, für das gl_Position.z außerhalb von -1 bis 1 liegt. Aber selbst wenn ich gl_Position.z auf eine konstante Zahl im Shader zwinge:

gl_Position.z = -0.01;

Es gibt immer noch eine korrekte Z-Pufferung und Beschneidung basierend auf gl_Position.w!Wie lauten die Regeln?

War es hilfreich?

Lösung

Der Wert von gl_Position befindet sich in dem, was OpenGL "Clip Space" nennt. Es ist ein homogenes Koordinatensystem . Insbesondere sind die XYZ-Ausmaße des Clipraums [-W, + W]. Jeder Scheitelpunkt befindet sich also in einem eigenen Clipbereich.

Ich bin mir nicht sicher, was Sie genau unter "Was sind die Regeln?" verstehen. Der Clip-Bereich gl_Position wird im homogenen Raum gegen den Ansichtsbereich abgeschnitten. Sie werden also für jeden Scheitelpunkt in den Bereich [-W, + W] geschnitten. Es ist schwer vorstellbar, dass dies in einem projektiven homogenen Raum der Fall ist, aber die Mathematik funktioniert, also spielt es keine Rolle.

Danach werden die abgeschnittenen Scheitelpunkte in den NDC-Raum (Normalized Device Coordinate) transformiert. Dies bedeutet, dass die XYZ des Clipraums durch W geteilt wird. Alle diese Scheitelpunkte liegen im Bereich [-1, 1].

Von dort aus erfolgt die Ansichtsfenster-Transformation. Die glViewport-Parameter skalieren die Scheitelpunkte vom [-1, 1] NDC-Bereich zum Ansichtsfensterbereich. Dadurch werden Punkte in Fensterraum umgewandelt. Im Fensterbereich werden sie gerastert.

Das XY des Fensterbereichs wird durch glViewport gesteuert. Die Z-Werte für den Fensterraum werden durch glDepthRange gesteuert. Der Standardtiefenbereich ist ein Nahwert von 0 und ein Fernwert von 1 (WARNUNG: Die Nah- / Fernebenen der Perspektivmatrix haben nichts mit dem Tiefenbereich gemeinsam. Verwechseln Sie die beiden nicht). Daher wird das [-1, 1] des Z im NDC-Raum auf [nah, fern] im Fensterraum abgebildet.

Das sind "die Regeln".

Andere Tipps

Sie verwenden glClearDepth (1.0f); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL);

Der Tiefenpuffer hat einen Wert zwischen 0 und 1 (maximale Tiefe). Verwenden Sie GL_LEQUAL, was bedeutet, dass alles auf den Bildschirm gezeichnet wird, da der Tiefenwert kleiner oder gleich 1 ist.

Weitere Informationen finden Sie unter: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top