Hullshaderphase (HS)
Die Hull-Shader-Stufe (HS) ist eine der Tessellationsstufen, die eine einzelne Oberfläche eines Modells effizient in viele Dreiecke aufteilen. Die Hull-Shaderphase (HS) erzeugt einen Geometriepatch (und Patchkonstanten), der jedem Eingabepatch (Quad, Dreieck oder Linie) entspricht. Ein Hull-Shader wird einmal pro Patch aufgerufen und transformiert Eingabesteuerungspunkte, die eine Oberflächen mit niedriger Reihenfolge definieren, in Kontrollpunkte, die einen Patch bilden. Außerdem werden einige Berechnungen pro Patch durchgeführt, um Daten für die Tessellatorphase (TS) und die Domänen-Shaderphase (DS) bereitzustellen.
Zweck und Verwendung
Die drei Tessellationsstufen arbeiten zusammen, um Oberflächen mit höherer Reihenfolge (die das Modell einfach und effizient halten) in viele Dreiecke für das detaillierte Rendering in der Grafikpipeline zu konvertieren. Die Tessellationsstufen umfassen die Hull-Shaderphase (HS), die TS-Stufe (Tessellator) und die Domain Shader-Stufe (DS).
Die Hull-Shaderphase (HS) ist eine programmierbare Shaderstufe. Ein Rumpf-Shader wird mit einer HLSL-Funktion implementiert.
Ein Hull-Shader arbeitet in zwei Phasen: einer Kontrollpunktphase und einer Patchkonstantenphase, die parallel von der Hardware ausgeführt werden. Der HLSL-Compiler extrahiert den Parallelismus in einem Hull-Shader und codiert ihn in Bytecode, der die Hardware steuert.
- Die Kontrollpunktphase arbeitet einmal für jeden Kontrollpunkt, liest die Kontrollpunkte für einen Patch und generiert einen Ausgabesteuerungspunkt (identifiziert durch eine ControlPointID).
- Die Patchkonstantenphase arbeitet einmal pro Patch, um Edge-Tessellationsfaktoren und andere Patchkonstanten zu generieren. Intern können viele Patchkonstantenphasen gleichzeitig ausgeführt werden. Die Patchkonstantenphase verfügt über schreibgeschützten Zugriff auf alle Eingabe- und Ausgabesteuerungspunkte.
Eingabe
Zwischen 1 und 32 Eingabesteuerungspunkten, die gemeinsam eine Oberflächen mit niedriger Reihenfolge definieren.
- Der Hull-Shader deklariert den Zustand, der von der Tessellatorphase (TS) benötigt wird. Dies umfasst Informationen wie die Anzahl der Kontrollpunkte, den Patch-Face-Typ und den Typ der Partitionierung, die beim Tessellieren verwendet werden soll. Diese Informationen werden in der Regel als Deklarationen am Anfang des Shadercodes angezeigt.
- Tessellationsfaktoren bestimmen, wie viel die einzelnen Patches unterteilt werden sollen.
Ausgabe
Zwischen 1 und 32 Ausgabesteuerungspunkten, die zusammen einen Patch bilden.
- Die Shaderausgabe liegt zwischen 1 und 32 Kontrollpunkten, unabhängig von der Anzahl der Tessellationsfaktoren. Die Steuerungspunkteausgabe eines Hull-Shaders kann von der Domänen-Shader-Stufe genutzt werden. Patchkonstantendaten können von einem Domänen-Shader genutzt werden. Tessellationsfaktoren können von der Tessellator -Stufe (TS) und der Domain Shader -Stufe (DS) verwendet werden.
- Wenn der Hull-Shader einen Rand-Tessellationsfaktor auf ≤ 0 oder NaN festlegt, wird der Patch gekullt (nicht angegeben). Daher kann die Tessellatorphase ausgeführt oder nicht ausgeführt werden, der Domänen-Shader wird nicht ausgeführt, und für diesen Patch wird keine sichtbare Ausgabe erstellt.
Beispiel
[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
InputPatch<MyInPoint, 12> InPts)
{
MyOutPoint result;
...
result = TransformControlPoint( InPts[Id] );
return result;
}
Weitere Informationen finden Sie unter How To: Create a Hull Shader.
Verwandte Themen