it-swarm.com.de

Wann erfolgt der Übergang vom Clipbereich zu Bildschirmkoordinaten?

Ich studierte die Rendering-Pipeline und als ich zum Clipping-Stadium kam, wurde erklärt, dass aus dem Ansichtsbereich (Auge oder Kamera) zum Clip-Space, der auch als normalisierter Geräte-Space bezeichnet wird, übergeben werden muss. NDC), das ist ein kubischer Raum von -1 bis 1. 

Jetzt verstehe ich nicht, wann der Übergang von diesem Raum zum Koordinatenraum des Bildschirms geschieht: 

  1. Gleich nach dem Clipping und vor der Rasterung? 

  2. Nach der Rasterung und vor Schere und Z-Test? 

  3. Am Ende kurz vor dem Schreiben in den Bildspeicher?

30
Geoffrey91

Nein, der Clip-Space und der NDC-Space sind nicht dasselbe.

Der Clipbereich ist tatsächlich einen Schritt von NDC entfernt. Alle Koordinaten werden durch Clip.W geteilt, um NDC zu erzeugen. Alles, was außerhalb des Bereichs [-1, 1] im resultierenden NDC-Bereich liegt, entspricht einem Punkt außerhalb des Clipping-Volumens. Es gibt einen Grund, warum der Koordinatenraum vor NDC als Clipbereich bezeichnet wird.

Streng genommen ist der NDC-Raum jedoch nicht unbedingt kubisch. Es ist wahr, dass der NDC-Speicherplatz in OpenGL ein Cube ist, in Direct3D jedoch nicht. In D3D reicht die Z-Koordinate im NDC-Raum von 0.0 bis 1.0, während sie im GL von -1.0 bis 1.0 reicht. X und Y verhalten sich in GL und D3D gleich (dh sie reichen von -1.0 bis 1.0). NDC ist ein Standardkoordinatenraum, der jedoch in verschiedenen APIs unterschiedlich dargestellt ist.

Zum Schluss tritt der NDC-Platz für die Bildschirmanzeige (AKA-Fensterbereich) während der Rasterung auf und wird durch das Ansichtsfenster und den Tiefenbereich definiert. Fragmentpositionen wären in keinem anderen Koordinatenraum wirklich sinnvoll, und dies führt dazu, dass die Rasterung erzeugt wird: Fragmente.


Aktualisieren:

Mit der Erweiterung GL_ARB_clip_control , die in OpenGL 4.5 eingeführt wurde, können Sie die NDC-Konvention von D3D in GL übernehmen.

Traditionelles OpenGL-Verhalten ist:

glClipControl (GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE);

Direct3D-Verhalten kann erreicht werden durch:

glClipControl (GL_UPPER_LEFT, GL_ZERO_TO_ONE); // Y-axis is inverted in D3D
41

Clip Space und NDC (normalisierte Gerätekoordinaten) sind nicht dasselbe, sonst hätten sie keine anderen Namen. 

Im Clip-Bereich befinden sich die Raumpunkte nach der Punkttransformation durch die Projektionsmatrix, jedoch vor der Normalisierung durch w

Der NDC-Raum ist der Raumpunkt, der sich nach der Normalisierung durch w befindet. 

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/projektionsmatrix-GPU-rendering-pipeline-clipping

Camera space --> 
x projection matrix ---> 
Clip space (before normalisation) --->
Clipping ---> 
Normalisation by w (x/w, y/w, z/w) --->
NDC space (in the range [-1, 1] in x and y)
10
user18490

Laut Apple ist der Clip-Bereich anscheinend mit NDC identisch.

https://developer.Apple.com/documentation/metal/hello_triangle

Zitat: 

Die Hauptaufgabe einer Vertex-Funktion (auch als Vertex-Shader bezeichnet) besteht darin, eingehende Vertex-Daten zu verarbeiten und jeden Vertex auf eine Position im Viewport abzubilden. Auf diese Weise können nachfolgende Stufen in der Pipeline auf diese Viewport-Position verweisen und Pixel darstellen Die Scheitelpunktfunktion erfüllt diese Aufgabe, indem beliebige Scheitelpunktkoordinaten in normalisierte Gerätekoordinaten übersetzt werden, die auch als Clip-Space-Koordinaten bezeichnet werden. "

Ein weiteres Zitat aus Kommentaren im Beispielcode:

"Die Ausgabeposition jedes Vertex-Shaders befindet sich im Clip-Bereich (auch als normalisierter Gerätekoordinatenraum oder NDC bezeichnet)."

Vielleicht liegt das daran, dass das Tutorial in 2D ist? Irreführende Aussagen ..

1
Siamaster

NDC-Speicherplatz ist Clip-Speicherplatz, NDC-Speicherplatz in Fensterbereich wird von Hardware ausgeführt, dies geschieht nach NDC und vor der Rasterisierung. 

Es gibt eine API zum Festlegen der Breite und Höhe. Der Standardwert hat dieselbe Größe wie die Fenstergröße.

// metal
func setViewport(_ viewport: MTLViewport)
// OpenGL
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

NDC-Speicherplatz für OpenGL, xyz-Bereich [-1, 1]. Für Metal ist Z 0 bis 1

Der NDC-Raum ist normalerweise ein linkes System. 

0
lbsweek