Share via


Ansichten und Zuschneiden

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

Das Anzeigen von Frustum

Ein Anzeige frustum ist ein 3D-Volumen in einer Szene, die relativ zur Kamera des Viewports positioniert ist. Die Form der Lautstärke beeinflusst, wie Modelle aus dem Kamerabereich auf den Bildschirm projiziert werden. 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 Ferne. Für die perspektivische Betrachtung kann das Ansichts frustum als Pyramide visualisiert werden, wobei die Kamera wie in der folgenden Abbildung an der Spitze positioniert ist. Diese Pyramide wird von einer vorderen und hinteren Clippingebene überschnitten. Das Volumen innerhalb der Pyramide zwischen den Clippingebenen vorne und hinten ist das Anzeige frustum. Objekte sind nur sichtbar, wenn sie sich in diesem Volume befinden.

Abbildung eines Anzeige-Frustrums mit einem Beschneidungsplan von vorne und hinten

Wenn Sie sich vorstellen, dass Sie in einem dunklen Raum stehen und durch ein quadratisches Fenster schauen, visualisieren Sie ein Sehen frustum. In dieser Analogie ist die nahe Beschneidungsebene das Fenster, und die hintere Clipping-Ebene ist das, was schließlich Ihre Sicht unterbricht - der Wolkenkratzer auf der anderen Straßenseite, die Berge in der Ferne oder überhaupt nichts. Sie können alles in der abgeschnittenen Pyramide sehen, die am Fenster beginnt und mit allem endet, was Ihre Ansicht unterbricht, und Sie können nichts anderes sehen.

Das Anzeige frustum wird durch fov (Sichtfeld) und durch die Entfernungen der vorderen und hinteren Clippingebenen 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 zwischen der Kamera und dem 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 unter Projektionstransformation.

Viewport-Rechteck

Eine Viewportstruktur 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-Clipping-Volume 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 wurden. Sie können das Seitenverhältnis des Viewports vor dem Clipping mithilfe der Projektionstransformation anpassen.

Hinweis MinZ und MaxZ geben die Tiefenbereiche an, in die die Szene gerendert wird und nicht zum Ausschneiden verwendet wird. Die meisten Anwendungen legen diese Werte auf 0,0 und 1,0 fest, damit das System den gesamten Bereich der Tiefenwerte im Tiefenpuffer rendern kann. In einigen Fällen können Sie Spezialeffekte erzielen, indem Sie andere Tiefenbereiche verwenden. Für instance können Sie zum Rendern einer Heads-up-Anzeige in einem Spiel beide Werte auf 0,0 festlegen, um das System zu zwingen, Objekte in einer Szene im Vordergrund zu rendern, oder Sie können beide auf 1,0 festlegen, um ein Objekt zu rendern, das immer im Hintergrund sein soll.

 

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

Direct3D verwendet den Viewportstandort und die Abmessungen, um die Scheitelpunkte zu skalieren, um eine gerenderte Szene an die geeignete 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 widerzuspiegeln, wobei y nach unten steigt. Nachdem diese Matrix angewendet wurde, sind Scheitelpunkte immer noch homogen - d. h. sie existieren noch als [x,y,z,w]-Vertices - und sie müssen in nicht homogene Koordinaten konvertiert werden, bevor sie an den Rasterisierer gesendet werden.

Hinweis Anwendungen legen in der Regel MinZ und MaxZ auf 0,0 bzw. 1,0 fest, damit das System im 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 beide 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 Projektionsraum wie folgt:

-wc<= xc<= wc

-wc<= yc<= wc

0 <= zc<= wc

Wobei: x, y, z und w die Vertexkoordinaten darstellen, nachdem die Projektionstransformation angewendet wurde. Alle Scheitelpunkte, die über eine x-, y- oder z-Komponente außerhalb dieser Bereiche verfügen, werden abgeschnitten, wenn clipping aktiviert ist (das Standardverhalten).

Koordinatensysteme und Geometrie