Benutzerclipebenen auf Hardware der Featureebene 9
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 auszuführen.
- Hintergrund
- Syntax
- Erstellen von Clipebenen im Clipraum auf Featureebene 9 und höher
- Zugehörige Themen
Hintergrund
Sie können über die Methoden IDirect3DDevice9::SetClipPlane und IDirect3DDevice9::GetClipPlane auf Benutzerclipebenen in der Microsoft Direct3D 9-API zugreifen. In Microsoft Direct3D 10 und höher können Sie über die SV_ClipDistance Semantik auf Clipebenen von Benutzern zugreifen. Vor Windows 8 war SV_ClipDistance jedoch nicht für 9_x Hardware auf Featureebene in den Direct3D 10- oder Direct3D 11-APIs verfügbar. Vor Windows 8 konnte daher nur über die Direct3D 9-API auf Benutzerclipebenen mit Featureebene 9_x Hardware zugegriffen werden. Direct3D Windows Store-Apps können die Direct3D 9-API nicht verwenden. Hier wird die Syntax beschrieben, mit der Sie über die Direct3D 11-API auf Featureebene 9_x und höher auf Benutzerclipebene zugreifen können.
Apps verwenden Clipebenen, um eine Reihe unsichtbarer Ebenen innerhalb der 3D-Welt zu definieren, die alle gezeichneten Grundtypen ausschneiden (wegwerfen). Windows zeichnet kein Pixel, das sich auf der negativen Seite von Clipebenen befindet. Apps können dann Clipebenen verwenden, um planare Spiegelungen zu rendern.
Syntax
Verwenden Sie diese Syntax, um Clipebenen als Funktionsattribute in einer Funktionsdeklaration zu 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;
}
Dieses Beispiel für ein Vertex-Shaderfragment bezeichnet zwei Clipebenen. Es wird angezeigt, dass Sie das neue clipplanes-Attribut in eckigen Klammern unmittelbar vor dem Rückgabewert des Vertex-Shaders platzieren müssen. In Klammern nach dem clipplanes-Attribut stellen Sie eine Liste mit bis zu 6 float4-Konstanten bereit, die die Ebenenkoeffizienten für jede aktive Clipebene definieren. Das Beispiel zeigt auch, dass Sie die Koeffizienten jeder Ebene in einem konstanten Puffer festlegen müssen.
Hinweis
Es ist keine Syntax verfügbar, um eine Clipebene dynamisch zu deaktivieren. Sie müssen entweder einen ansonsten identischen Shader ohne Clipplanes-Attribut neu kompilieren, oder Ihre App kann die Koeffizienten in Ihrem Konstantenpuffer auf Null festlegen, sodass die Ebene keine Geometrie mehr beeinflusst.
Diese Syntax ist für jedes Vertex-Shaderziel der Version 4.0 oder höher verfügbar, einschließlich vs_4_0_level_9_1 und vs_4_0_level_9_3.
Erstellen von Clipebenen im Clipraum auf Featureebene 9 und höher
Hier wird gezeigt, wie Sie Clipebenen im Clipbereich auf Featureebene 9_x und höher erstellen.
Hintergrundlektüre
"Einführung in die 3D-Spieleprogrammierung mit DirectX 10" von Frank D. Luna erläutert den grafischen Mathematischen Hintergrund (Kapitel 1, 2 und 3), die Sie benötigen, sowie die verschiedenen Raum- und Raumtransformationen, die im Vertex-Shader auftreten (Abschnitte 5.6 und 5.8).
10Level9-Featureebenen
In Direct3D 10 und höher können Sie jeden sinnvollen Raum ausschneiden, häufig im Welt- oder Sichtraum. Direct3D 9 verwendet jedoch den Clipraum, d. h. den Projektionsraum vor der Perspektivteilung. Vektoren befinden sich im Clipraum, wenn der Vertex-Shader sie an Phasen übergibt, die in der Grafikpipeline folgen.
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 9_x und höher auf Featureebene unterstützt, müssen Sie auch die allgemeine Funktion zum Anwenden von Clipebenen im Clipbereich 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 emittierten Scheitelpunkts, der jede der im Attribut angegebenen globalen float4-Konstanten enthält. Das Direct3D 9-Objekt verfügt über genügend Metadaten, damit die 10Level9-Runtime die entsprechenden Aufrufe von IDirect3DDevice9::SetClipPlane ausgibt.
Mathe auf Clipebene
Eine Clipebene wird durch einen Vektor mit 4 Komponenten definiert. Die ersten drei Komponenten definieren einen x-, y- und z-Vektor, der vom Ursprung in dem Raum ausgeht, den wir ausschneiden möchten. Dieser Vektor impliziert eine Ebene, die senkrecht zum Vektor verläuft und den Ursprung durchläuft. Windows behält alle Pixel auf der Vektorseite der Ebene bei und klammert alle Pixel hinter der Ebene. Die vierte w-Komponente schiebt die Ebene zurück und bewirkt, dass Windows entlang der Vektorlinie weniger ausschneiden (ein negatives w führt dazu, dass Windows mehr ausklammert). Wenn die x-, y-, z-Komponenten einen Einheitsvektor (normalisiert) bilden, verschiebt w die Ebene mit den Einheiten zurück.
Die Mathematik, die die Grafikverarbeitungseinheit (Graphics Processing Unit, GPU) ausführt, um das Clipping zu bestimmen, ist ein einfaches Punktprodukt zwischen dem Vertexvektor (x, y, z, 1) und dem Vektor der Clippingebene. Mit diesem mathematischen Vorgang wird eine Projektionslänge auf dem Clipebenenvektor erstellt. Ein negatives Punktprodukt zeigt an, dass sich der Scheitelpunkt auf der abgeschnittenen Seite der Ebene befindet.
Ausschneiden im Sichtbereich
Hier ist unser Scheitelpunkt im Sichtraum:
Hier ist unsere Clipebene im Sichtraum:
Hier ist das Punktprodukt von Scheitelpunkt und Clipebene im Sichtraum:
ClipDistance = v · C = vₓCₓ +vyCy + vzCz + Cw
Dieser mathematische Vorgang funktioniert für ein Direct3D 10- oder höher-Objekt, aber nicht für ein Direct3D 9-Objekt. Für Direct3D 9 müssen wir zuerst die Projektionstransformation in den Clipraum durchlaufen.
Projektionsmatrix
Eine Projektionsmatrix transformiert einen Scheitelpunkt aus dem Sichtraum (wobei der Ursprung das Auge des Betrachters ist, +x rechts, +y ist nach oben und +z geradeaus) in den Clipraum. Die Projektionsmatrix liest den Scheitelpunkt für Hardwareausschnitte und die Rasterungsphase vor. Hier ist eine Standardperspektivematrix (andere Projektionen erfordern eine andere Mathematik):
- *r* Verhältnis von Fensterbreite/-höhe *α* Betrachtungswinkel *f* Abstand vom Viewer zur fernen Ebene *n* Abstand vom Viewer zur nahen Ebene
Die nächste Matrix ist eine vereinfachte Version der vorherigen Matrix. Wir zeigen, dass die Matrix vereinfacht wurde, sodass wir sie später im Matrixmultiplikationsvorgang verwenden können.
Nun transformieren wir unseren Sichtraum-Scheitelpunkt mit einer Matrixvervielfachung in einen Clipraum:
In unserem Matrixmultipliziervorgang werden unsere x- und y-Komponenten nur geringfügig angepasst, aber unsere z- und w-Komponenten sind recht bereinigt. Unsere Clipebene gibt uns nicht mehr das, was wir wollen.
Clip space clip plane
Hier möchten wir eine Clip-Raum-Clipebene erstellen, deren Punktprodukt mit unserem Clipraumvertex uns den gleichen Wert wie v · C im Abschnitt Clipping in view space .
v · C = v P · CP
vₓCₓ +vyCy + vzCz + Cw = vₓPₓCPₓ +vyPyCPy + vzAyCPzy C P z + z z + CPw
Nun können wir den vorherigen mathematischen Vorgang durch Vertexkomponente in vier separate Formeln aufteilen:
Unsere Ansichtsraumclipebene und unsere Projektionsmatrix leiten ab und geben uns unsere Clip-Raum-Clipebene.
Zugehörige Themen