Eingabeassemierphase
Der Eingabeassessbler (Input Assembler, IA) führt Dreiecke, Linien oder Punkte in die Renderingpipeline ein, indem Quellgeometriedaten aus 1D-Puffern abgerufen werden.
Vertexdaten können aus mehreren Puffern stammen und in einem Array von Strukturen von jedem Puffer aus zugegriffen werden. Die Puffer sind jeweils an einen einzelnen Eingabeslot gebunden und erhalten einen Strukturschritt. Das Layout der Daten über alle Puffer hinweg wird durch eine Eingabedeklaration angegeben, in der jeder Eintrag ein Element definiert. Das Element enthält einen Eingabeslot, einen Strukturoffset, einen Datentyp und ein Zielregister (für den ersten aktiven Shader in der Pipeline).
Eine bestimmte Sequenz von Scheitelpunkten wird aus Daten erstellt, die aus Puffern abgerufen werden. Die Daten werden in einem Durchlauf abgerufen, der durch eine Kombination aus festem Funktionszustand und verschiedenen Draw*()-DDI-Aufrufen geleitet wird. Verschiedene primitive Topologien (z. B. Punktliste, Zeilenliste, Dreiecksliste und Dreiecksstreifen) stehen zur Verfügung, um die Sequenz von Vertexdaten als Sequenz von Grundtypen darzustellen.
Vertexdaten können auf eine von zwei Arten erzeugt werden. Die erste Möglichkeit zum Erstellen von Vertexdaten ist das nicht indizierte Rendering, d. h. der sequenzielle Durchlauf von Puffern, die Vertexdaten enthalten. Die Vertexdaten stammen von einem Startoffset bei jeder Pufferbindung. Die zweite Möglichkeit zum Erstellen von Vertexdaten ist das indizierte Rendering, bei dem es sich um einen sequenziellen Durchlauf eines einzelnen Puffers handelt, der skalare ganzzahlige Indizes enthält. Die Indizes stammen von einem Startoffset in den Puffer. Jeder Index gibt an, wo Daten aus einem Puffer abgerufen werden sollen, der Scheitelpunktdaten enthält. Die Indexwerte sind unabhängig von den Merkmalen der Puffer, auf die sie verweisen. Puffer werden durch Deklarationen beschrieben. Nicht indiziertes und indiziertes Rendering, jeweils auf eigene Weise, erzeugen Adressen, von denen Vertexdaten im Speicher abgerufen werden, und fügen die Ergebnisse anschließend zu Scheitelpunkten und Grundtypen zusammen.
Das Rendern von Instanzgeometrie wird aktiviert, indem der sequenzielle Durchlauf entweder im nicht indizierten oder indizierten Rendering einen Bereich innerhalb jedes Vertexpuffers (nicht indizierter Fall) oder Indexpuffer (indizierter Fall) durchlaufen kann. Pufferbindungen können als instance Daten oder Vertexdaten identifiziert werden. Diese Identifizierung gibt an, wie der gebundene Puffer beim Rendern von Instanzen verwendet wird. Die Adresse, die durch nicht indiziertes oder indiziertes Rendering generiert wird, wird zum Abrufen von Vertexdaten verwendet, was auch die Schleife berücksichtigt, wenn die Runtime instanziertes Rendering ausführt. Instanzdaten werden dagegen immer sequenziell durchlaufen, beginnend mit einem Pufferoffset, mit einer Frequenz, die einem Schritt pro instance entspricht (z. B. einen Schritt vorwärts, nachdem die Anzahl der Scheitelpunkte in einem instance durchlaufen wurde). Die Schrittrate für instance Daten kann auch als subharmonisch der instance Frequenz ausgewählt werden (d. a. ein Schritt vorwärts instance, jeder dritte instance usw.).
Ein weiterer Sonderfall der IA ist, dass sie Puffer lesen kann, in die die Streamausgabephase geschrieben hat. Ein solches Szenario ermöglicht eine neue Art von Zeichnungsvorgang, DrawAuto. DrawAuto ermöglicht es, eine dynamische Ausgabemenge, die in Stream-Ausgabepuffer geschrieben wurde, wiederzuverwenden, ohne dass die CPU beteiligt ist, um zu bestimmen, wie viele Daten tatsächlich geschrieben wurden.
Zusätzlich zur Erstellung von Vertexdaten aus Puffern kann die IA automatisch drei Skalarzählerwerte generieren: VertexID, PrimitiveID und InstanceID für die Eingabe in Shaderphasen in der Renderingpipeline.
Beim indizierten Rendern von Streifentopologien, z. B. Dreiecksstreifen, wird ein Mechanismus zum Zeichnen mehrerer Streifen mit einem einzigen *Draw*()-Aufruf (d. a. dem Befehl *cut to cut strips) bereitgestellt.
Die Direct3D-Runtime ruft die folgenden Treiberfunktionen auf, um die IA zu erstellen, einzurichten und zu zerstören: