Pipeline grafica

La pipeline grafica Direct3D è progettata per la generazione di grafica per applicazioni di gioco in tempo reale. Il flusso di dati dall'input all'output attraversa ogni fase configurabile o programmabile.

Tutte le fasi possono essere configurate usando l'API Direct3D. Le fasi che presentano core di shader comuni (blocchi rettangolari arrotondati) sono programmabili usando il linguaggio di programmazione HLSL. In questo modo la pipeline è estremamente flessibile e adattabile.

La più comunemente usata è la fase Vertex Shader (VS) e la fase Pixel Shader (PS). Se non si forniscono nemmeno queste fasi dello shader, vengono usati un vertice pass-through e un pixel shader predefiniti senza operazioni.

diagram of the data flow in the direct3d 11 programmable pipeline

Fase Input-Assembler

La fase Input Assembler (IA) fornisce dati primitivi e di adiacenza alla pipeline, ad esempio triangoli, linee e punti, inclusi ID di semantica per rendere gli shader più efficienti, riducendo l'elaborazione alle primitive che non sono già state elaborate.

  • Input

    Dati primitivi (triangoli, linee e/o punti), dai buffer riempiti dall'utente in memoria. Ed eventualmente dati di adiacenza. Un triangolo corrisponde a 3 vertici per ogni triangolo e possibilmente 3 vertici per i dati di adiacenza per triangolo.

  • Output

    Primitive con valori associati generati dal sistema (ad esempio un ID primitivo, un ID istanza o un ID vertice).

Fase Vertex-Shader

La fase Vertex Shader (VS) elabora i vertici, in genere eseguendo operazioni come trasformazioni, rivestimento e illuminazione. Un vertex shader accetta un singolo vertice di input e produce un singolo vertice di output. Singole operazioni per vertice, ad esempio Trasformazioni, Rivestimento, Morphing e Illuminazione per vertice.

  • Input

    Un singolo vertice, con valori generati dal sistema VertexID e InstanceID. Ogni vertice di input del vertex shader può essere costituito da un massimo di 16 vettori a 32 bit (fino a 4 componenti ciascuno).

  • Output

    Un singolo vertice. Ogni vertice di output può essere costituito da un numero di vettori a 4 componenti a 16-32 bit.

Fase Hull Shader

La fase Hull Shader (HS) è una delle fasi di tassellatura, che suddivide in modo efficiente una singola superficie di un modello in molti triangoli. Uno hull shader viene richiamato una volta per patch e trasforma i punti di controllo di input che definiscono una superficie di ordine inferiore in punti di controllo che costituiscono una patch. Esegue anche alcuni calcoli per patch in modo da fornire dati per la fase Tessellator (TS) e la fase Domain Shader (DS).

  • Input

    Tra 1 e 32 punti di controllo di input, che insieme definiscono una superficie di ordine basso.

  • Output

    Tra 1 e 32 punti di controllo di output, che insieme costituiscono una patch. Lo hull shader dichiara lo stato per la fase TS (Tessellator), incluso il numero di punti di controllo, il tipo di faccia della patch e il tipo di partizionamento da usare durante la tassellatura.

Fase Tessellator

La fase Tessellator (TS) crea un modello di campionamento del dominio che rappresenta la patch geometrica e genera un set di oggetti più piccoli (triangoli, punti o linee) che collegano questi campioni.

  • Input

    Il tassellatore funziona una volta per patch usando i fattori di tassellatura (che specificano con quale precisione verrà tassellato il dominio) e il tipo di partizionamento (che specifica l'algoritmo usato per suddividere una patch) che vengono passati dalla fase hull-shader.

  • Output

    Il tassellatore restituisce le coordinate uv (e opzionalmente w) come pure la topologia della superficie nella fase domain-shader.

Fase Domain Shader

La fase Domain Shader (DS) calcola la posizione del vertice di un punto suddiviso nella patch di output. Calcola la posizione del vertice corrispondente a ogni campione di dominio. Un domain shader viene eseguito una volta per ogni punto di output della fase tessellator e ha accesso in sola lettura alle costanti patch di output e patch di output dello hull shader nonché alle coordinate UV di uscita della fase tessellator.

  • Input

    Uno shader di dominio utilizza i punti di controllo di output dalla fase hull shader (HS). Gli output dello hull shader includono: punti di controllo, dati costanti Patch e fattori di tassellatura (i fattori di tassellatura possono includere i valori utilizzati dal tassellatore a funzione fissa, nonché i valori non elaborati, prima di arrotondare per tassellatura del numero intero, che facilita la geomorfia, ad esempio). Uno shader di dominio viene richiamato una volta per ogni coordinata di output dalla fase TS (Tessellator).

  • Output

    La fase Domain Shader (DS) restituisce la posizione del vertice di un punto suddiviso nella patch di output.

Fase Geometry Shader

La fase Geometry Shader (GS) elabora intere primitive: triangoli, linee e punti, insieme ai vertici adiacenti. Supporta l'amplificazione della geometria e la de-amplificazione. È utile per gli algoritmi, tra cui Point Sprite Expansion, Dynamic Particle Systems, Fur/Fin Generation, Shadow Volume Generation, Single Pass Render-to-Cubemap, Per-Primitive Material Swapping e Per-Primitive Material Setup, inclusa la generazione di coordinate baricentriche come dati primitivi in modo che un pixel shader possa eseguire l'interpolazione di attributi personalizzata.

  • Input

    A differenza dei vertex shader, che operano su un singolo vertice, gli input del geometry shader sono i vertici di una primitiva completa (tre vertici per triangoli, due vertici per le linee o un singolo vertice per il punto).

  • Output

    La fase Geometry Shader (GS) è in grado di generare più vertici che formano una singola topologia selezionata. Le topologie di output del geometry shader a disposizione sono tristrip, linestrip e pointlist. Il numero di primitive generate può variare liberamente all'interno di qualsiasi chiamata del geometry shader, anche se il numero massimo di vertici che possono essere generati deve essere dichiarato in modo statico. Le lunghezze di strip generate da una chiamata di geometry shader possono essere arbitrarie e le nuove strip possono essere create tramite la funzione HLSL RestartStrip.

Fase Stream Output

La fase Stream Output (SO) genera costantemente dati dei vertici (o flussi) dalla fase attiva precedente a uno o più buffer in memoria. I dati trasmessi alla memoria possono essere fatti ricircolare nella pipeline come dati di input o rilettura dalla CPU.

  • Input

    Dati dei vertici di una fase precedente della pipeline.

  • Output

    La fase Stream Output (SO) restituisce continuamente (o flussi) i dati dei vertici della precedente fase attiva, ad esempio la fase Geometry Shader (GS), in uno o più buffer in memoria. Se la fase Geometry Shader (GS) è inattiva e la fase Stream Output (SO) è attiva, emette continuamente i dati dei vertici dalla fase Domain Shader (DS) ai buffer in memoria (o se DS è anche inattivo, dalla fase Vertex Shader (VS).

Fase Rasterizer

La fase Rasterizer (RS) ritaglia le primitive che non sono nella visualizzazione, le prepara per la fase Pixel Shader (PS) e determina come richiamare i pixel shader. Inoltre converte le informazioni vettoriali (composte da forme o primitive) in un'immagine raster (composta da pixel) allo scopo di visualizzare la grafica 3D in tempo reale.

  • Input

    I vertici (x,y,z,w) che entrano nella fase Rasterizzatore vengono considerati nello spazio di ritaglio omogeneo. In questo spazio di coordinate l'asse X punta a destra, Y punta verso l'alto e Z punta lontano dalla fotocamera.

  • Output

    Pixel effettivi di cui è necessario eseguire il rendering. Include alcuni attributi dei vertici da usare nell'interpolazione da parte del Pixel Shader.

Fase Pixel-Shader

La fase Pixel Shader (PS) riceve i dati interpolati per una primitiva e genera dati per pixel, ad esempio il colore.

  • Input

    Quando la pipeline è configurata senza uno shader geometrico, un pixel shader è limitato a 16 input a 32 bit e a 4 componenti. In caso contrario, un pixel shader può richiedere fino a 32 input a 32 bit e a 4 componenti. I dati di input del pixel shader includono attributi dei vertici (che possono essere interpolati con o senza correzione prospettica) o possono essere considerati come costanti per primitiva. Gli input del pixel shader vengono interpolati dagli attributi dei vertici della primitiva da rasterizzare, in base alla modalità di interpolazione dichiarata. Se una primitiva viene ritagliata prima della rasterizzazione, la modalità di interpolazione viene rispettata anche durante il processo di ritaglio.

  • Output

    Un pixel shader può produrre fino a 8 colori a 32 bit a 4 componenti o nessun colore se il pixel viene scartato. I componenti del registro di output del pixel shader devono essere dichiarati prima di poterli usare; ogni registro è consentito a una maschera distinta per la scrittura di output.

Fase Output Merger

La fase Output Merger (OM) combina vari tipi di dati di output (valori pixel shader, informazioni di profondità e stencil) con il contenuto dei buffer di destinazione di rendering e profondità/stencil per generare il risultato finale della pipeline.

  • Input

    Gli input di Output Merger sono lo stato pipeline, i dati pixel generati dagli shader pixel, il contenuto delle destinazioni di rendering e il contenuto dei buffer depth/stencil.

  • Output

    Colore pixel di cui è stato eseguito il rendering finale.