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-
- Syntax
- Erstellen von Clipebenen im Clip space auf Featureebene 9 und höher
- Verwandte Themen
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:
Hier sehen Sie unsere Clipebene im Ansichtsbereich:
Hier sehen Sie das Punktprodukt von Scheitelpunkt und Clipebene im Ansichtsbereich:
ClipDistance = v · C = vₓCₓ +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
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.
Jetzt transformieren wir unseren Ansichtsraumvertex in clip space mit einer 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.
v · C = v P · CP
vₓCₓ +vyCy + vzCz + Cw = vₓPₓCPₓ +vyPyCPy + vzAyCPz + BCPz + vzCPw
Jetzt können wir den vorhergehenden mathematischen Vorgang durch vertexkomponente in vier separate Formeln unterteilen:
Unsere Ansichtsraumausschnittebene und unsere Projektionsmatrix leiten uns ab und geben uns unsere Clip Space Clip Plane.
Verwandte Themen