Freigeben über


Grafikpipeline

Die Direct3D-Grafikpipeline dient zum Erstellen von Grafiken für Echtzeitspiele. Von der Eingabe zur Ausgabe fließen Daten durch die einzelnen konfigurier- oder programmierbaren Phasen.

Alle Phasen können mit der Direct3D-API konfiguriert werden. Phasen, die allgemeine Shaderkerne (die abgerundeten rechteckigen Blöcke) enthalten, können mithilfe der HLSL-Programmiersprache programmiert werden. Dies macht die Pipeline extrem flexibel und anpassbar.

Die am häufigsten verwendete Phase sind die Vertex-Shaderphase (VS) und die Pixelshaderphase (PS). Wenn Sie selbst diese Shaderstufen nicht bereitstellen, werden standardmäßige No-Op-, Pass-Through-Vertex- und Pixelshader verwendet.

Diagramm des Datenflusses in der programmierbaren Direct3d 11-Pipeline

Eingabeassemblerphase

Die Eingabeassemblerphase (Input Assembler, IA) stellt primitive und angrenzende Daten für die Pipeline bereit, z. B. Dreiecke, Linien und Punkte, einschließlich semantischer IDs, um Shader effizienter zu gestalten, indem die Verarbeitung auf Grundtypen reduziert wird, die noch nicht verarbeitet wurden.

  • Eingabe

    Primitive Daten (Dreiecke, Linien und/oder Punkte) aus vom Benutzer gefüllten Puffern im Arbeitsspeicher. Und möglicherweise Angrenzende Daten. Ein Dreieck wäre 3 Scheitelpunkte für jedes Dreieck und möglicherweise 3 Scheitelpunkte für Adjacency-Daten pro Dreieck.

  • Output

    Grundtypen mit angefügten vom System generierten Werten (z. B. eine Grundtyp-ID, eine Instanz-ID oder eine Vertex-ID).

Vertex-Shaderphase

Die Vertexshaderphase (VS) verarbeitet Scheitelpunkte und führt in der Regel Vorgänge wie Transformationen, Skinning und Beleuchtung aus. Ein Vertex-Shader verwendet einen einzelnen Eingabevertex und erzeugt einen einzelnen Ausgabevertex. Einzelne Pro-Vertex-Vorgänge, z. B. Transformationen, Skinning, Morphing und Beleuchtung pro Vertex.

  • Eingabe

    Ein einzelner Scheitelpunkt mit vom System generierten Werten "VertexID" und "InstanceID". Jeder Vertex-Shadereingabevertex kann aus bis zu 16 32-Bit-Vektoren (jeweils bis zu 4 Komponenten) bestehen.

  • Output

    Ein einzelner Scheitelpunkt. Jeder Ausgabevertex kann aus bis zu 16 32-Bit-4-Komponentenvektoren bestehen.

Hull-Shader-Stufe

Die Hull-Shader-Stufe (HS) ist eine der Tessellationsstufen, die eine einzelne Oberfläche eines Modells effizient in viele Dreiecke aufteilen. 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.

  • Eingabe

    Zwischen 1 und 32 Eingabesteuerungspunkten, die gemeinsam eine Oberflächen mit niedriger Reihenfolge definieren.

  • Output

    Zwischen 1 und 32 Ausgabesteuerungspunkten, die zusammen einen Patch bilden. Der Hull-Shader deklariert den Zustand für die Tessellatorphase (TS), einschließlich der Anzahl der Kontrollpunkte, des Typs der Patchseite und des Typs der Partitionierung, die beim Tessellieren verwendet werden soll.

Tessellatorphase

Die Tessellatorphase (TS) erstellt ein Samplingmuster der Domäne, das den Geometriepatch darstellt, und generiert eine Reihe kleinerer Objekte (Dreiecke, Punkte oder Linien), die diese Beispiele verbinden.

  • Eingabe

    Der Tessellator wird einmal pro Patch mit den Tessellationsfaktoren (die angeben, wie fein die Domäne tesselliert wird) und den Typ der Partitionierung (der den Algorithmus angibt, der zum Aufschneiden eines Patches verwendet wird) ausgeführt, die aus der Hull-Shader-Stufe übergeben werden.

  • Output

    Der Tessellator gibt uv-Koordinaten (und optional w) und die Oberflächentopologie in die Domänen-Shader-Stufe aus.

Domänen-Shader-Stufe

Die Ds-Stufe (Domain Shader) berechnet die Vertexposition eines unterteilten Punkts im Ausgabepatch. Er berechnet die Scheitelpunktposition, die den einzelnen Domänenbeispielen entspricht. Ein Domänen-Shader wird einmal pro Ausgabepunkt der Tessellatorphase ausgeführt und verfügt über schreibgeschützten Zugriff auf den Hull-Shader-Ausgabepatch und die Ausgabepatchkonstanten und die Tessellator-Ausgabe-UV-Koordinaten.

  • Eingabe

    Ein Domänen-Shader verwendet Ausgabesteuerungspunkte aus der Hull-Shaderphase (HS). Die Hüllen-Shader-Ausgaben umfassen: Kontrollpunkte, Patchkonstantendaten und Tessellationsfaktoren (die Tessellationsfaktoren können die werte enthalten, die vom Tessellator mit fester Funktion verwendet werden, sowie die Rohwerte - bevor sie durch ganzzahlige Tessellation gerundet werden, was z. B. geomorphing erleichtert). Ein Domänen-Shader wird einmal pro Ausgabekoordinate aus der Tessellatorphase (TS) aufgerufen.

  • Output

    Die Ds-Stufe (Domain Shader) gibt die Vertexposition eines unterteilten Punkts im Ausgabepatch aus.

Geometry-Shaderphase

Die Geometry-Shader-Stufe (GS) verarbeitet ganze Grundtypen: Dreiecke, Linien und Punkte sowie ihre angrenzenden Scheitelpunkte. Es unterstützt geometrieverstärkung und De amplifikation. Es ist nützlich für Algorithmen wie Point Sprite Expansion, Dynamic Particle Systems, Fur/Fin Generation, Shadow Volume Generation, Single Pass Render-to-Cubemap, Per-Primitive Material Swapping und Per-Primitive Material Setup - einschließlich Generierung baryzentrischer Koordinaten als Grundtypdaten, sodass ein Pixelshader benutzerdefinierte Attributinterpolation ausführen kann.

  • Eingabe

    Im Gegensatz zu Vertex-Shadern, die auf einem einzelnen Scheitelpunkt arbeiten, sind die Eingaben des Geometrie-Shaders die Scheitelpunkte für einen vollständigen Grundtyp (drei Scheitelpunkte für Dreiecke, zwei Scheitelpunkte für Linien oder einzelner Scheitelpunkt für Punkt).

  • Output

    Die Geometry-Shaderphase (GS) kann mehrere Scheitelpunkte ausgeben, die eine einzelne ausgewählte Topologie bilden. Verfügbare Geometrie-Shaderausgabetopologien sind Tristrip, Linienstreifen und Zeigerliste. Die Anzahl der ausgegebenen Grundtypen kann in jedem Aufruf des Geometrie-Shaders frei variieren, obwohl die maximale Anzahl von Scheitelpunkten, die ausgegeben werden könnten, statisch deklariert werden muss. Striplängen, die von einem Geometrie-Shaderaufruf ausgegeben werden, können beliebig sein, und neue Strips können über die RestartStrip HLSL-Funktion erstellt werden.

Streamausgabestufe

Die Streamausgabephase (SO) gibt kontinuierlich Vertexdaten aus der vorherigen aktiven Phase in einen oder mehrere Puffer im Arbeitsspeicher aus (oder datenströme). Daten, die in den Arbeitsspeicher gestreamt wurden, können als Eingabedaten in die Pipeline zurückgerückt oder von der CPU zurückgelesen werden.

  • Eingabe

    Vertexdaten aus einer vorherigen Pipelinephase.

  • Output

    Die Streamausgabephase (SO) gibt kontinuierlich Vertexdaten aus der vorherigen aktiven Phase aus, z. B. die Geometry Shader -Stufe (GS) in einen oder mehrere Puffer im Arbeitsspeicher. Wenn die Geometry-Shader-Stufe (GS) inaktiv ist und die Streamausgabephase (SO) aktiv ist, gibt sie kontinuierlich Vertexdaten aus der Domänen-Shaderphase (DS)-Phase an Puffer im Arbeitsspeicher aus (oder wenn der DS ebenfalls inaktiv ist, aus der Vertex-Shaderphase (VS) aus).

Rasterizerstufe

Der Rasterizer (RS) stellt Grundtypen aus, die sich nicht in der Ansicht befinden, bereitet Grundtypen für die Pixelshaderphase (PS) vor und bestimmt, wie Pixelshader aufgerufen werden. Konvertiert Vektorinformationen (bestehend aus Formen oder Grundtypen) in ein Rasterbild (bestehend aus Pixeln), um 3D-Grafiken in Echtzeit anzuzeigen.

  • Eingabe

    Scheitelpunkte (x,y,z,w), die in die Rasterizer-Phase gelangen, werden als homogener Clipraum angenommen. In diesem Koordinatenbereich sind die X-Achsenpunkte rechts, Y-Punkte nach oben und Z-Punkte von der Kamera entfernt.

  • Output

    Die tatsächlichen Pixel, die gerendert werden müssen. Enthält einige Vertexattribute für die Verwendung in der Interpolation durch den Pixelshader.

Pixelshaderphase

Die Pixelshaderphase (PS) empfängt interpolierte Daten für einen Grundtyp und generiert daten pro Pixel, z. B. Farbe.

  • Eingabe

    Wenn die Pipeline ohne Geometrie-Shader konfiguriert ist, ist ein Pixelshader auf 16, 32-Bit-, 4-Komponenten-Eingaben beschränkt. Andernfalls kann ein Pixelshader bis zu 32, 32-Bit- und 4-Komponenteneingaben dauern. Pixel-Shadereingabedaten enthalten Vertexattribute (die mit oder ohne Perspektivkorrektur interpoliert werden können) oder als Grundtypkonstanten behandelt werden können. Pixel-Shadereingaben werden basierend auf dem deklarierten Interpolationsmodus aus den Vertexattributen des Grundtyps interpoliert. Wenn ein Grundtyp vor der Rasterung abgeschnitten wird, wird auch der Interpolationsmodus während des Clippingprozesses berücksichtigt.

  • Output

    Ein Pixelshader kann bis zu 8, 32-Bit-, 4-Komponenten-Farben oder keine Farbe ausgeben, wenn das Pixel verworfen wird. Die Komponenten des Pixelshader-Ausgaberegisters müssen deklariert werden, bevor sie verwendet werden können. jedes Register ist eine unterschiedliche Ausgabeschreibmaske zulässig.

Ausgabezusammenführungsphase

Die Ausgabezusammenführungsphase (OUTPUT Merger, OM) kombiniert verschiedene Arten von Ausgabedaten (Pixelshaderwerte, Tiefen- und Schabloneninformationen) mit dem Inhalt des Renderziel- und Tiefen-/Schablonenpuffers, um das endgültige Pipelineergebnis zu generieren.

  • Eingabe

    Ausgabezusammenführungseingaben sind der Pipelinezustand, die pixeldaten, die von den Pixelshadern generiert werden, die Inhalte der Renderziele und den Inhalt der Tiefen-/Schablonenpuffer.

  • Output

    Die letzte gerenderte Pixelfarbe.