Condividi tramite


Fase dell'assembler di input

L'assembler di input (IA) introduce triangoli, linee o punti nella pipeline di rendering eseguendo il pull dei dati geometry di origine fuori dai buffer 1D.

I dati dei vertici possono venire da più buffer e possono essere accessibili in modo di matrice di strutture da ogni buffer. I buffer sono ognuno associato a un singolo slot di input e data una struttura stride. Il layout dei dati in tutti i buffer viene specificato da una dichiarazione di input, in cui ogni voce definisce un elemento. L'elemento contiene uno slot di input, un offset di struttura, un tipo di dati e un registro di destinazione (per il primo shader attivo nella pipeline).

Una determinata sequenza di vertici viene creata fuori dai dati recuperati dai buffer. I dati vengono recuperati in un attraversamento diretto da una combinazione di stato predefinito e varie chiamate DDI Draw*(). Sono disponibili varie topologie primitive (ad esempio, elenco di punti, elenco riga, triangolo e strip triangolo) per rendere la sequenza di dati del vertice rappresenta una sequenza di primitive.

I dati dei vertici possono essere generati in uno dei due modi. Il primo modo per produrre dati dei vertici è il rendering non indicizzato , ovvero l'attraversamento sequenziale dei buffer che contengono dati dei vertici. I dati del vertice hanno origine in corrispondenza di un offset iniziale in ogni associazione di buffer. Il secondo modo per produrre i dati dei vertici è il rendering indicizzato , che è attraversamento sequenziale di un singolo buffer che contiene indici integer scalari. Gli indici hanno origine in un offset iniziale nel buffer. Ogni indice indica dove recuperare i dati da un buffer contenente i dati dei vertici. I valori di indice sono indipendenti dalle caratteristiche dei buffer a cui fanno riferimento. I buffer sono descritti dalle dichiarazioni. Il rendering non indicizzato e indicizzato, ognuno in modo personalizzato, produce indirizzi da cui recuperare i dati dei vertici in memoria e successivamente assemblare i risultati in vertici e primitive.

Il rendering della geometria istanza è abilitato consentendo l'attraversamento sequenziale, nel rendering non indicizzato o indicizzato, per eseguire un ciclo su un intervallo all'interno di ogni buffer dei vertici (caso non indicizzato) o buffer di indice (caso indicizzato). Le associazioni di buffer possono essere identificate come dati dell'istanza o dati dei vertici. Questa identificazione specifica come usare il buffer associato durante l'esecuzione del rendering dell'istanza. L'indirizzo generato dal rendering non indicizzato o indicizzato viene usato per recuperare i dati dei vertici, che determina anche il ciclo quando il runtime esegue il rendering dell'istanza. I dati dell'istanza, d'altra parte, vengono sempre attraversati in sequenza a partire da un offset per buffer, a una frequenza uguale a un passaggio per istanza, ad esempio un passaggio avanti dopo l'attraversamento del numero di vertici in un'istanza. La frequenza dei passaggi per i dati dell'istanza può essere scelta anche come sotto-armonica della frequenza dell'istanza, ovvero un passo avanti ogni altra istanza, ogni terza istanza e così via.

Un altro caso speciale dell'IA è che può leggere i buffer a cui è stata scritta la fase di output del flusso. Questo scenario consente un nuovo tipo di operazione di disegno , DrawAuto. DrawAuto consente di riutilizzare una quantità dinamica di output scritta nei buffer di output di flusso, senza il coinvolgimento della CPU, per determinare la quantità di dati effettivamente scritti.

Oltre a produrre dati dei vertici dai buffer, l'IA può generare automaticamente tre valori di contatore scalari: VertexID, PrimitiveID e InstanceID, per le fasi di input delle fasi di rendering nella pipeline di rendering.

Nel rendering indicizzato delle topologie di strip, ad esempio strip di triangoli, viene fornito un meccanismo per il disegno di più strip con una singola chiamata *Draw*() (ovvero il comando *cut per tagliare le strisce).

Il runtime Direct3D chiama le funzioni driver seguenti per creare, configurare ed eliminare l'IA:

CalcPrivateElementLayoutSize

CreateElementLayout

DestroyElementLayout

IaSetIndexBuffer

IaSetInputLayout

IaSetTo topologia

IaSetVertexBuffers