Freigeben über


Ansichten und Zuschneiden

Ein Viewport ist ein zweidimensionales Rechteck (2D), in das eine 3D-Szene projiziert wird. In Direct3D ist das Rechteck als Koordinaten in einer Direct3D-Oberfläche vorhanden, die das System als Renderingziel verwendet. Die Projektionstransformation wandelt Scheitelpunkte in das Koordinatensystem um, das für den Viewport verwendet wird. Ein Viewport wird auch verwendet, um den Bereich der Tiefenwerte auf einer Renderzieloberfläche anzugeben, in die eine Szene gerendert wird (in der Regel 0,0 bis 1,0).

Das Anzeige-Frustum

Ein Anzeige-Frustum ist 3D-Lautstärke in einer Szene, die relativ zur Kamera des Viewports positioniert ist. Die Form der Lautstärke wirkt sich auf die Projizierten Modelle aus dem Kamerabereich auf den Bildschirm aus. Die häufigste Art der Projektion, eine perspektivische Projektion, ist dafür verantwortlich, dass Objekte in der Nähe der Kamera größer erscheinen als Objekte in der Entfernung. Bei der Perspektivansicht kann das Ansichtsfrstum als Pyramide dargestellt werden, wobei die Kamera an der Spitze positioniert ist, wie in der folgenden Abbildung dargestellt. Diese Pyramide wird durch eine vordere und hintere Beschneidungsebene überschnitten. Das Volumen innerhalb der Pyramide zwischen der vorderen und der hinteren Beschneidungsebene ist das Seh-Frustum. Objekte sind nur sichtbar, wenn sie sich in diesem Volume befinden.

Abbildung eines Seh-Frustrums mit einem Vorder- und Rückausschnittplan

Wenn Sie sich vorstellen, dass Sie in einem dunklen Raum stehen und durch ein quadratisches Fenster blicken, visualisieren Sie ein Sicht-Frustum. In dieser Analogie ist die nahe abgeschnittene Ebene das Fenster, und die hintere Ausschnittebene ist alles, was schließlich Ihre Sicht unterbricht - der Wolkenkratzer über die Straße, die Berge in der Ferne oder gar nichts. Sie können alles in der abgeschnittenen Pyramide sehen, die am Fenster beginnt und mit dem endet, was Ihre Ansicht unterbricht, und Sie können nichts anderes sehen.

Das Anzeige-Frustum wird durch Fov (Sichtfeld) und durch die Entfernungen der Vorder- und Rückseitenausschnitte definiert, die in Z-Koordinaten angegeben sind, wie im folgenden Diagramm dargestellt.

Diagramm des Anzeige-Frustums

In diesem Diagramm ist die Variable D der Abstand von der Kamera zum Ursprung des Raums, der im letzten Teil der Geometriepipeline definiert wurde – der Anzeigetransformation. Dies ist der Raum, um den Sie die Grenzen Ihres Seh-Frustums anordnen. Informationen dazu, wie diese D-Variable zum Erstellen der Projektionsmatrix verwendet wird, finden Sie in der Projektionstransformation

Viewport-Rechteck

Eine Viewport-Struktur enthält vier Member (X, Y, Width, Height), die den Bereich der Renderzieloberfläche definieren, in der eine Szene gerendert wird. Diese Werte entsprechen dem Zielrechteck oder dem Viewportrechteck, wie im folgenden Diagramm dargestellt.

Diagramm des Viewport-Rechtecks

Die Werte, die Sie für die Elemente "X", "Y", "Width", "Height" angeben, sind Bildschirmkoordinaten relativ zur oberen linken Ecke der Renderzieloberfläche. Die Struktur definiert zwei zusätzliche Member (MinZ und MaxZ), die die Tiefenbereiche angeben, in die die Szene gerendert wird.

Direct3D geht davon aus, dass das Viewport-Clippingvolumen von -1,0 bis 1,0 in X und von 1,0 bis -1,0 in Y reicht. Dies waren die Einstellungen, die in der Vergangenheit am häufigsten von Anwendungen verwendet werden. Sie können das Viewport-Seitenverhältnis vor dem Ausschneiden mithilfe der Projektionstransformation anpassen.

Hinweis MinZ und MaxZ geben die Tiefenbereiche an, in die die Szene gerendert wird und nicht für den Clipping verwendet wird. Die meisten Anwendungen legen diese Werte auf 0,0 und 1,0 fest, damit das System in den gesamten Bereich der Tiefenwerte im Tiefenpuffer gerendert werden kann. In einigen Fällen können Sie Spezialeffekte mithilfe anderer Tiefenbereiche erzielen. Um beispielsweise eine Heads-up-Anzeige in einem Spiel zu rendern, können Sie beide Werte auf 0,0 festlegen, damit das System Objekte in einer Szene im Vordergrund rendert, oder Sie können beide auf 1,0 festlegen, um ein Objekt zu rendern, das immer im Hintergrund sein sollte.

 

Die Dimensionen, die in den Elementen "X", "Y", "Width", "Height" einer Viewport-Struktur verwendet werden, definieren die Position und Abmessungen des Viewports auf der Renderzieloberfläche. Diese Werte befinden sich in Bildschirmkoordinaten relativ zur oberen linken Ecke der Oberfläche.

Direct3D verwendet die Viewportposition und -dimensionen, um die Scheitelpunkte zu skalieren, um eine gerenderte Szene an die entsprechende Position auf der Zieloberfläche anzupassen. Intern fügt Direct3D diese Werte in die folgende Matrix ein, die auf jeden Scheitelpunkt angewendet wird.

Formel der Matrix, die auf jeden Scheitelpunkt angewendet wird

Diese Matrix skaliert Scheitelpunkte entsprechend den Viewportabmessungen und dem gewünschten Tiefenbereich und übersetzt sie an die entsprechende Position auf der Renderzieloberfläche. Die Matrix kippt auch die Y-Koordinate, um einen Bildschirmursprung in der oberen linken Ecke mit einer Y-Erhöhung nach unten zu spiegeln. Nachdem diese Matrix angewendet wurde, sind Scheitelpunkte noch homogen - d. h., sie existieren immer noch als [x,y,z,w]-Scheitelpunkte - und müssen in nicht homogene Koordinaten konvertiert werden, bevor sie an den Rasterizer gesendet werden.

Hinweis Anwendungen legen in der Regel MinZ und MaxZ auf 0,0 bzw. 1,0 fest, damit das System in den gesamten Tiefenbereich gerendert wird. Sie können jedoch andere Werte verwenden, um bestimmte Auswirkungen zu erzielen. Sie können beispielsweise beide Werte auf 0,0 festlegen, um alle Objekte im Vordergrund zu erzwingen, oder sie auf 1,0 festlegen, um alle Objekte im Hintergrund zu rendern.

 

Löschen eines Viewports

Durch das Löschen des Viewports wird der Inhalt des Viewportrechtecks auf der Renderzieloberfläche zurückgesetzt. Es kann auch das Rechteck in den Tiefen- und Schablonenpufferoberflächen löschen.

Einrichten des Viewports für clipping

Die Ergebnisse der Projektionsmatrix bestimmen das Clippingvolumen im Projektionsbereich wie:

-wc<= xc<= w c= wc

-wc<= yc<= wc

0 <= zc<= wc

Dabei stellen x, y, z und w die Vertexkoordinaten dar, nachdem die Projektionstransformation angewendet wurde. Alle Scheitelpunkte, die eine x-, y- oder Z-Komponente außerhalb dieser Bereiche aufweisen, werden abgeschnitten, wenn der Clipping aktiviert ist (standardverhalten).

Koordinatensysteme und Geometrie