(0) exportieren Drucken
Alle erweitern

Tessellation – Überblick

Die Direct3D 11-Laufzeit unterstützt drei neue Phasen, die eine Tessellation implementieren, bei der detailarme Teilflächen in detailreichere Primitiven auf der GPU konvertiert werden. Bei der Tessellation werden Oberflächen einer höheren Ordnung in in geeignete Strukturen für das Rendering aufgeteilt (bzw. aufgebrochen).

Durch Implementierung der Tessellation in der Hardware kann eine Grafikpipeline detailärmere Modelle (mit einer geringeren Anzahl an Polygonen) auswerten und mit einer höheren Detailtiefe rendern. Im Gegensatz zu einer softwarebasierten Tessellation kann eine in der Hardware implementierte Tessellation eine unglaubliche Anzahl an visuellen Details generieren (einschließlich einer Unterstützung für Ersetzungszuordnung), ohne dass dabei den Modellgrößen visuelle Details hinzugefügt oder die Aktualisierungsraten beeinträchtigt werden müssten.

Vorteile bei der Tessellation

Tessellation:

  • Spart viel Speicher und Bandbreite, was einer Anwendung ermöglicht, höher detaillierte Oberflächen aus niedrigauflösenden Modellen zu rendern. Die in der Direct3D 11-Pipeline implementierte Tessellationstechnik unterstützt auch die Ersetzungszuordnung (Displacement Mapping), die atemberaubende Mengen an Oberflächendetails erzeugen kann.
  • Unterstützt skalierbare Renderingtechniken, z. B. kontinuierliche oder ansichtsabhängige Detailtiefen, die spontan berechnet werden können.
  • Verbessert die Leistung durch die Ausführung aufwändiger Berechnungen bei niedrigerer Frequenz (die Berechnungen erfolgen am detailärmeren Modell). Dies könnte Übergangsberechnungen mit Übergangsformen oder Morphzielen für realistische Animationen oder physikalische Berechnungen für Kollisionserkennung oder die Dynamik weicher Körper einschließen.

Die Direct3D 11-Pipeline implementiert Tessellation in der Hardware, wodurch die Arbeit von der CPU auf die GPU verlagert wird. Dies kann zu sehr großen Leistungsverbesserungen führen, wenn eine Anwendung große Anzahlen von Morphzielen und/oder ausgeklügelten Skinning-/Deformationsmodellen implementiert. Um auf die neuen Tessellationsfunktionen zuzugreifen, müssen Sie etwas über einige neue Pipelinephasen erfahren.

Neue Pipelinephasen

Tessellation berechnet mithilfe der GPU eine detailreichere Oberfläche aus einer aus viereckigen Patches, dreieckigen Patches oder Isolinien erstellten Oberfläche. Zur Annäherung an die Oberfläche der höheren Ordnung wird jeder Patch unter Verwendung der Tessellationsfaktoren in Dreiecke, Punkte oder Linien unterteilt. Die Direct3D 11-Pipeline implementiert die Tessellation mithilfe von drei neuen Pipelinephasen:

  • Hüllen-Shader-Phase- Eine programmierbare Shader-Phase, die Ausgabekontrollpunkte (und Patchkonstanten) aus Eingabekontrollpunkten erzeugt; die Dimension und die Verwendung dieser Kontrollpunkte werden vom Benutzer bestimmt.
  • Tessellatorphase- Eine Pipelinephase mit fester Funktion, in der eine Domäne (Viereck, Dreieck oder Linie) in viele kleinere Objekte (Dreiecke, Punkte oder Linien) unterteilt wird.
  • Domänen-Shader-Phase- Eine programmierbare Shader-Phase, die die Scheitelpunktposition (Vertex) eines unterteilten Punkts im Ausgabepatch berechnet.

Diagramm der Direct3D 11-Pipeline, in dem Hüllen-Shader-, Tessellator- und Domänen-Shader-Phasen hervorgehoben sind

In den vorhergehenden Diagrammen werden die neuen Phasen der Direct3D 11-Pipeline hervorgehoben.

Hüllen-Shader-Phase

Ein Hüllen-Shader, der pro Patch einmal aufgerufen wird, transformiert Eingabekontrollpunkte, die eine Oberfläche niederer Ordnung definieren, in Kontrollpunkte, die einen Patch bilden. Er führt außerdem einige Berechnungen auf dem Patch durch, um der Tessellations- und der Domänen-Phase Daten bereitzustellen. Auf der einfachsten, der Blackbox-Ebene würde die Hüllen-Shader-Phase in etwa wie in dem folgenden Diagramm aussehen.

Diagramm der Hüllen-Shader-Phase

Ein Hüllen-Shader wird mit einer HLSL-Funktion implementiert und hat die folgenden Eigenschaften:

  • Die Shader-Eingabe besteht aus zwischen 1 und 32 Kontrollpunkten.
  • Die Shader-Ausgabe besteht aus zwischen 1 und 32 Kontrollpunkten und ist unabhängig von der Anzahl der Tessellationsfaktoren. Die von einem Hüllen-Shader ausgegebenen Kontrollpunkte können von der Domänen-Shader-Phase genutzt werden. Patchkonstantendaten können von einem Domänen-Shader genutzt werden; Tessellationsfaktoren können vom Domänen-Shader und der Tessellationsphase genutzt werden.
  • Tessellationsfaktoren bestimmen, wie stark die einzelnen Patches unterteilt werden.
  • Der Shader deklariert den für die Tessellatorphase erforderlichen Status. Dies schließt bestimmte Informationen ein, wie z. B. die Anzahl der Kontrollpunkte, den Typ der Patchfläche und den Typ der Partitionierung, die bei der Tessellation verwendet werden soll. Diese Informationen erscheinen in der Regel als Deklarationen am Anfang des Shader-Codes.
  • Wenn die Hüllen-Shader-Phase einen Kantentessellationsfaktor auf ≤ 0 oder NaN festlegt, wird der Patch herausgefiltert. Das hat zur Folge, dass die Tessellatorphase möglicherweise nicht ausgeführt wird. Außerdem wird Domänen-Shader nicht ausgeführt, und es wird keine sichtbare Ausgabe für diesen Patch erzeugt.

Auf einer tieferen Ebene operiert ein Hüllen-Shader tatsächlich in zwei Phasen: eine Kontrollpunktphase und eine Patchkonstantenphase, die von der Hardware parallel ausgeführt werden. Der HLSL-Compiler extrahiert den Parallelismus in einem Hüllen-Shader und codiert ihn in Bytecode, durch den die Hardware gesteuert wird.

  • Die Kontrollpunktphase operiert einmal für jeden Kontrollpunkt, liest die Kontrollpunkte für einen Patch und generiert einen Einerausgangkontrollpunkt (durch eine ControlPointID identifiziert).
  • Die Patchkonstantenphase operiert einmal pro Patch und erzeugt dabei Kantentessellationsfaktoren und andere patchbasierte Konstanten. Intern können viele Patchkonstantenphasen gleichzeitig ausgeführt werden. Die Patchkonstantenphase hat einen schreibgeschützten Zugriff auf alle Eingabe- und Ausgabekontrollpunkte.

Es folgt ein Beispiel für einen Hüllen-Shader.



[patchsize(12)]
[patchconstantfunc(MyPatchConstantFunc)]
MyOutPoint main(uint Id : SV_ControlPointID,
     InputPatch<MyInPoint, 12> InPts)
{
     MyOutPoint result;
     
     ...
	 
     result = TransformControlPoint( InPts[Id] );

     return result;
}


Ein Beispiel, in dem ein Hüllen-Shader erstellt wird, finden Sie unter Vorgehensweise: Erstellen eines Hüllen-Shaders.

Tessellatorphase

Der Tessellator ist eine Phase mit fester Funktion, die dadurch initialisiert wird, dass ein Hüllen-Shader an die Pipeline gebunden wird (siehe Vorgehensweise: Initialisieren der Tessellatorphase). Die Aufgabe der Tessellatorphase besteht darin, eine Domäne (Viereck, Dreieck oder Linie) in viele kleinere Objekte (Dreiecke, Punkte oder Linien) zu unterteilen. Der Tessellator gliedert eine kanonische Domäne in einem normalisierten (Null-zu-Eins) Koordinatensystem. Eine viereckige Domäne wird z. B. als Einheitsquadrat tesselliert (parkettiert).

Der Tessellator operiert einmal pro Patch, und verwendet dabei die Tessellationsfaktoren (die angeben, wie fein die Domäne tesselliert wird) und den Partitionierungstyp (der den zum Aufteilen eines Patches in Slices verwendeten Algorithmus angibt), die von der Hüllen-Shader-Phase übergeben werden. Der Tessellator gibt uv- (und optional w-)Koordinaten und die Oberflächentopologie an die Domänen-Shader-Phase aus.

Intern operiert der Tessellator in zwei Phasen:

  • Die erste Phase verarbeitet die Tessellationsfaktoren, wobei Rundungsprobleme behoben, sehr kleine Faktoren behandelt, Faktoren reduziert und kombiniert und eine 32-Bit-Gleitkomma-Arithmetik verwendet werden.
  • Die zweite Phase generiert Punkt- oder Topologielisten auf Grundlage des ausgewählten Partitionierungstyps. Dies ist die Hauptaufgabe der Tessellatorphase, und verwendet werden 16-Bit-Bruchzahlen mit Festpunktarithmetik. Festpunktarithmetik ermöglicht Hardwarebeschleunigung bei gleichzeitiger Beibehaltung einer akzeptablen Genauigkeit. Wenn beispielsweise ein 64 Meter breiter Patch gegeben ist, kann diese Genauigkeit Punkte mit einer Auflösung von 2 mm platzieren.
PartitionierungstypBereich
Fractional_odd[1...63]
Fractional_evenTessFactor-Bereich: [2..64]
IntegerTessFactor-Bereich: [1..64]
Pow2TessFactor-Bereich: [1..64]

 

Domänen-Shader-Phase

Ein Domänen-Shader berechnet die Scheitelpunktposition (Vertex) eines unterteilten Punkts im Ausgabepatch. Ein Domänen-Shader wird einmal pro Ausgabepunkt der Tessellatorphase ausgeführt und hat schreibgeschützten Zugriff auf die UV-Koordinaten der Ausgabe der Tessellatorphase, den Ausgabe-Patch des Hüllen-Shaders und die Ausgabe-Patchkonstanten des Hüllen-Shaders, wie das folgende Diagramm zeigt.

Diagramm der Domänen-Shader-Phase

Der Domänen-Shader hat folgende Eigenschaften:

  • Ein Domänen-Shader wird pro Ausgabekoordinate aus der Tessellatorphase einmal aufgerufen.
  • Ein Domänen-Shader nutzt die von der Hüllen-Shader-Phase ausgegebenen Kontrollpunkte.
  • Ein Domänen-Shader gibt die Position eines Scheitelpunkts (Vertex) aus.
  • Eingaben sind die Ausgaben des Hüllen-Shaders, einschließlich der Kontrollpunkte, Patchkonstantendaten und Tessellationsfaktoren. Die Tessellationsfaktoren können die Werte, die vom Tessellator mit fester Funktion verwendet werden, sowie die Rohwerte (z. B. vor dem Runden durch ganzzahlige Tessellation) enthalten, die beispielsweise das Geomorphing erleichtern.

Nachdem der Domänen-Shader abgeschlossen wurde, wird die Tessellation beendet, und die Pipelinedaten werden an die nächste Pipelinephase (Geometrie-Shader, Pixel-Shader usw.) übergeben. Ein Geometrie-Shader, der Primitiven mit Nachbarschaft (z. B. 6 Vertizes pro Dreieck) erwartet, ist nicht gültig, wenn die Tessellation aktiv ist (dies führt zu einem nicht definiertem Verhalten, das die Debugschicht meldet).

Es folgt ein Beispiel für einen Domänen-Shader:



void main( out    MyDSOutput result, 
           float2 myInputUV : SV_DomainPoint, 
           MyDSInput DSInputs,
           OutputPatch<MyOutPoint, 12> ControlPts, 
           MyTessFactors tessFactors)
{
     ...

     result.Position = EvaluateSurfaceUV(ControlPoints, myInputUV);
}


APIs zum Initialisieren von Tessellationsphasen

Tessellation wird mit zwei neuen programmierbaren Shader-Phasen implementiert: einem Hüllen-Shader und einem Domänen-Shader. Diese neuen Shader-Phasen werden mit HLSL-Code programmiert, der in Shader Model 5 definiert wird. Die neuen Shader-Ziele sind: hs_5_0 und ds_5_0. Wie bei allen programmierbaren Shader-Phasen wird der Code für die Hardware aus den kompilierten Shadern extrahiert und an die Laufzeit übergeben, wenn Shader über die APIs, wie z. B. DSSetShader und HSSetShader, an die Pipeline gebunden werden. Aber zunächst muss der Shader mit APIs, wie z. B. CreateHullShader und CreateDomainShader, erstellt werden.

Aktivieren Sie die Tessellation, indem Sie einen Hüllen-Shader erstellen uind diesen an die Hüllen-Shader-Phase binden (dadurch wird die Tessellatorphase automatisch eingerichtet). Um die abschließenden Scheitelpunktpositionen (Vertex) aus den tessellierten Patches zu generieren, müssen Sie auch einen Domänen-Shader erstellen und diesen an die Domänen-Shader-Phase binden. Sobald die Tessellation aktiviert ist, muss die Dateneingabe zur Eingabeassembler-Phase aus Patchdaten bestehen. Das heißt, dass die Eingabeassembler-Topologie eine Patchkonstantentopologie aus D3D11_PRIMITIVE_TOPOLOGY mit IASetPrimitiveTopology sein muss.

Um die Tessellation zu deaktivieren, legen Sie den Hüllen-Shader und den Domänen-Shader auf NULL fest. Weder die Geometrie-Shader-Phase noch die Datenstromausgabe-Phase können die Ausgabekontrollpunkte des Hüllen-Shaders oder Patchdaten lesen.

Vorgehensweisen:

Die Dokumentation enthält auch Beispiele zur Initialisierung der Tessellationsphasen.

ElementBeschreibung

How To: Create a Hull Shader

Erstellen eines Hüllen-Shaders.

How To: Design a Hull Shader

Konstruieren eines Hüllen-Shaders.

How To: Initialize the Tessellator Stage

Initialisieren der Tessellationsphase.

How To: Create a Domain Shader

Erstellen eines Domänen-Shaders.

How To: Design a Domain Shader

Erstellen eines Domänen-Shaders.

 

Verwandte Themen

Grafikpipeline

 

 

Microsoft führt eine Onlineumfrage durch, um Ihre Meinung zur MSDN-Website zu erfahren. Wenn Sie sich zur Teilnahme entscheiden, wird Ihnen die Onlineumfrage angezeigt, sobald Sie die MSDN-Website verlassen.

Möchten Sie an der Umfrage teilnehmen?
Anzeigen:
© 2014 Microsoft