Freigeben über


Benutzerclipebenen auf Featureebene 9 Hardware

Ab Windows 8 unterstützt Microsoft High Level Shader Language (HLSL) eine Syntax, die Sie mit der Microsoft Direct3D 11-API verwenden können, um Benutzerclipebenen auf Featureebene 9_x und höher anzugeben. Sie können diese Clipebenensyntax verwenden, um einen Shader zu schreiben, und dann dieses Shaderobjekt mit der Direct3D 11-API verwenden, um auf allen Direct3D-Featureebenen ausgeführt zu werden.

Hintergrund

Sie können über IDirect3DDevice9::SetClipPlane- und IDirect3DDevice9::GetClipPlane Methoden auf Benutzerausschnittebenen in der Microsoft Direct3D 9-API zugreifen. In Microsoft Direct3D 10 und höher können Sie über die SV_ClipDistance Semantik auf Benutzerclipebenen zugreifen. Vor Windows 8 war SV_ClipDistance jedoch nicht für Featureebene 9_x Hardware in den Direct3D 10- oder Direct3D 11-APIs verfügbar. Vor Windows 8 war also die einzige Möglichkeit, auf Benutzerclipebenen mit Featureebene 9_x Hardware zuzugreifen, über die Direct3D 9-API. Direct3D-Windows Store-Apps können die Direct3D 9-API nicht verwenden. Hier wird die Syntax beschrieben, die Sie für den Zugriff auf Benutzerclipebenen über die Direct3D 11-API auf Featureebene 9_x und höher verwenden können.

Apps verwenden Clipebenen, um eine Reihe unsichtbarer Ebenen innerhalb der 3D-Welt zu definieren, die alle gezeichneten Grundtypen abschneiden (wegwerfen). Windows zeichnet kein Pixel, das sich auf der negativen Seite aller Clipebenen befindet. Apps können dann Clipebenen verwenden, um planare Spiegelungen zu rendern.

Syntax

Verwenden Sie diese Syntax, um Clipebenen als Funktionsattribute in einer Funktionsdeklarationzu deklarieren. Hier verwenden wir beispielsweise die Syntax für ein Vertex-Shaderfragment:

cbuffer ClipPlaneConstantBuffer 
{
       float4 clipPlane1;
       float4 clipPlane2;
};

[clipplanes(clipPlane1,clipPlane2)]
VertexShaderOutput main(VertexShaderInput input)
{
       // the rest of the vertex shader doesn't refer to the clip plane
 
       …
 
       return output;
}

In diesem Beispiel für ein Vertexshaderfragment werden zwei Clipebenen bezeichnet. Es zeigt, dass Sie die neuen Clipplanes Attribut in eckigen Klammern unmittelbar vor dem Rückgabewert des Vertex-Shaders platzieren müssen. Innerhalb von Klammern nach dem Clipplanes Attribut geben Sie eine Liste von bis zu 6 float4 Konstanten an, die die Ebenenkoeffizienten für jede aktive Clipebene definieren. Das Beispiel zeigt auch, dass Sie die Koeffizienten jeder Ebene in einem Konstantenpuffer festlegen müssen.

Anmerkung

Es ist keine Syntax verfügbar, um eine Clipebene dynamisch zu deaktivieren. Sie müssen entweder einen andernfalls identischen Shader ohne Clipplanes Attribut neu kompilieren, oder Ihre App kann die Koeffizienten im Konstantenpuffer auf Null festlegen, sodass die Ebene keine Geometrie mehr beeinflusst.

 

Diese Syntax ist für ein beliebiges 4.0- oder höher-Vertex-Shaderziel verfügbar, das vs_4_0_level_9_1 und vs_4_0_level_9_3 enthält.

Erstellen von Clipebenen im Clip space auf Featureebene 9 und höher

Hier zeigen wir, wie Sie Clipebenen im Clip space auf Featureebene 9_x und höher erstellen.

Hintergrundlesevorgang

"Einführung in die 3D-Spieleprogrammierung mit DirectX 10" von Frank D. Luna erläutert den mathematischen Grafikhintergrund (Kapitel 1, 2 und 3), die Sie benötigen, sowie die verschiedenen Leerzeichen und Raumtransformationen, die im Vertex-Shader auftreten (Abschnitte 5.6 und 5.8).

10Level9-Featureebenen

In Direct3D 10 und höher können Sie einen Clip in einem beliebigen Raum erstellen, der sinnvoll ist, häufig im Raum der Welt oder im Sichtbereich. Direct3D 9 verwendet jedoch clip space, was die vorab perspektivische Aufteilung des Projektionsbereichs darstellt. Vektoren befinden sich im Clipspace, wenn der Vertex-Shader sie an Phasen übergibt, die in der Grafikpipelinefolgen.

Wenn Sie eine Windows Store-App schreiben, müssen Sie 10Level9-Featureebenen (Featureebene 9_x) verwenden, damit die App auf Featureebene 9_x und höherer Hardware ausgeführt werden kann. Da Ihre App Featureebenen 9_x und höher unterstützt, müssen Sie auch die allgemeine Funktion zum Anwenden von Clipebenen im Clipspace verwenden.

Wenn Sie einen Vertex-Shader mit vs_4_0_level_9_1 oder höher kompilieren, kann dieser Vertex-Shader das Clipplanes Attribut verwenden. Ein Direct3D 10- oder höher-Objekt verfügt über ein Punktprodukt des ausgegebenen Scheitelpunkts, der jeden der float4 globalen Konstanten enthält, die im Attribut angegeben sind. Das Direct3D 9-Objekt verfügt über genügend Metadaten, damit die 10Level9-Laufzeit die entsprechenden Aufrufe von IDirect3DDevice9::SetClipPlaneausstellen kann.

Clip plane mathe

Eine Clipebene wird durch einen Vektor mit 4 Komponenten definiert. Die ersten drei Komponenten definieren einen x-, y-, z-Vektor, der vom Ursprung im Raum ausgeht, den wir abschneiden möchten. Dieser Vektor impliziert eine Ebene, senkrecht zum Vektor und läuft durch den Ursprung. Windows behält alle Pixel auf der Vektorseite der Ebene bei und klammert alle Pixel hinter der Ebene. Die vierte w-Komponente verschiebt die Ebene zurück und bewirkt, dass Windows weniger abschneiden (ein negatives w bewirkt, dass Windows mehr ausschneiden) entlang der Vektorlinie. Wenn die x-, y-, z-Komponenten einen Einheitsvektor (normalisiert) erstellen, verschiebt w die Ebene w einheiten zurück.

Die Mathematik, die die Grafikverarbeitungseinheit (GPU) ausführt, um den Clipping zu bestimmen, ist ein einfaches Punktprodukt zwischen dem Vertexvektor (x, y, z, 1) und dem Clippingebenenvektor. Mit diesem mathematischen Vorgang wird eine Projektionslänge für den Clipebenenvektor erstellt. Ein negatives Punktprodukt zeigt den Scheitelpunkt an, der sich auf der beschnittenen Seite der Ebene befindet.

Ausschneiden im Ansichtsbereich

Hier sehen Sie unseren Scheitelpunkt im Ansichtsbereich:

Scheitelpunkt im Ansichtsbereich

Hier sehen Sie unsere Clipebene im Ansichtsbereich:

Clipebene im Ansichtsbereich

Hier sehen Sie das Punktprodukt von Scheitelpunkt und Clipebene im Ansichtsbereich:

ClipDistance = v · C = vCₓ +vyCy + vzCz + Cw

Dieser mathematische Vorgang funktioniert für ein Direct3D 10- oder höher-Objekt, funktioniert aber nicht für ein Direct3D 9-Objekt. Für Direct3D 9 müssen wir zunächst durch unsere Projektionstransformation in den Clip space gelangen.

Projektionsmatrix

Eine Projektionsmatrix transformiert einen Scheitelpunkt aus dem Ansichtsbereich (wobei der Ursprung das Auge des Betrachters ist, +x ist rechts, +y ist nach oben und +z gerade vorn) in den Clipbereich. Die Projektionsmatrix liest den Scheitelpunkt für Hardwareausschnitte und die Rasterungsphasevor. Hier ist eine Standardperspektivematrix (andere Projektionen erfordern unterschiedliche Mathematik):

*r* Verhältnis der Fensterbreite/Höhe *α* Betrachtungswinkel *f* Entfernung vom Betrachter zur weit entfernten Ebene *n* Entfernung vom Viewer zum nahe gelegenen Flugzeug
! [Projektionsmatrix](Bilder/projection-matrix.png)

Die nächste Matrix ist eine vereinfachte Version der vorherigen Matrix. Wir zeigen die Matrix vereinfacht an, damit wir sie später in der Matrix multiplizieren können.

vereinfachte Projektionsmatrix

Jetzt transformieren wir unseren Ansichtsraumvertex in clip space mit einer Matrix multiplizieren:

Matrix multiplizieren

In unserer Matrix multiplizieren sich unsere x- und y-Komponenten nur geringfügig, aber unsere z- und w-Komponenten sind recht gegled. Unser Clip-Flugzeug gibt uns nicht das, was wir mehr wollen.

Clip space clip plane

Hier möchten wir eine Clip Space Clip Plane erstellen, deren Punktprodukt mit unserem Clip Space Vertex uns denselben Wert wie v · C im Abschnitt Clipping im Ansichtsbereich Abschnitt.

clip plane

v · C = v P · CP

vCₓ +vyCy + vzCz + Cw = vPCPₓ +vyPyCPy + vzAyCPz + BCPz + vzCPw

Jetzt können wir den vorhergehenden mathematischen Vorgang durch vertexkomponente in vier separate Formeln unterteilen:

x-Scheitelpunktkomponente des Clip plane-Produkts

y-Scheitelpunktkomponente des Clip plane-Produkts

w-Scheitelpunktkomponente des Clip plane-Produkts

z-Vertexkomponente des Clip plane-Produkts

Unsere Ansichtsraumausschnittebene und unsere Projektionsmatrix leiten uns ab und geben uns unsere Clip Space Clip Plane.

Clip Space Clip Plane

Programmierhandbuch für HLSL-

Funktionsdeklarationssyntax