fase Output-Merger
La fase di unione dell'output (OM) genera il colore del pixel sottoposto a rendering finale usando una combinazione di stato della pipeline, i dati pixel generati dagli shader pixel, il contenuto delle destinazioni di rendering e il contenuto dei buffer depth/stencil. La fase OM è il passaggio finale per determinare quali pixel sono visibili (con test depth-stencil) e fondendo i colori dei pixel finali.
Differenze tra Direct3D 9 e Direct3D 10:
- Direct3D 9 implementa test alfa (usando stato di test alfa) per controllare se un pixel viene scritto in una destinazione di rendering di output.
- Direct3D 10 e versioni successive non implementa un test alfa (o uno stato di test alfa). Questo può essere controllato usando un pixel shader o con funzionalità depth/stencil.
Panoramica dei test di Depth-Stencil
Un buffer depth-stencil, creato come risorsa trama, può contenere dati di profondità e dati stencil. I dati di profondità vengono usati per determinare quali pixel si trovano più vicini alla fotocamera e i dati degli stencil vengono usati per mascherare i pixel che possono essere aggiornati. In definitiva, i dati dei valori depth e stencil vengono usati dalla fase di unione dell'output per determinare se un pixel deve essere disegnato o meno. Il diagramma seguente mostra concettualmente come viene eseguito il test depth-stencil.
Per configurare i test depth-stencil, vedere Configuring Depth-Stencil Functionality. Un oggetto depth-stencil incapsula lo stato depth-stencil. Un'applicazione può specificare lo stato depth-stencil oppure la fase OM userà i valori predefiniti. Le operazioni di fusione vengono eseguite su base pixel se il multicampionamento è disabilitato. Se il multicampionamento è abilitato, la fusione avviene per ogni multisample.
Il processo di utilizzo del buffer di profondità per determinare quale pixel deve essere disegnato è detto buffering di profondità, detto anche buffer z.
Quando i valori di profondità raggiungono la fase di unione dell'output (indipendentemente dal fatto che provenano dall'interpolazione o da un pixel shader) siano sempre bloccati: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) in base al formato/precisione del buffer di profondità, usando regole a virgola mobile. Dopo il blocco, il valore di profondità viene confrontato (usando DepthFunc) rispetto al valore del buffer di profondità esistente. Se non è associato alcun buffer di profondità, il test di profondità viene sempre superato.
Se non è presente alcun componente stencil nel formato depth-buffer o nessun limite di buffer di profondità, il test degli stencil viene sempre superato. In caso contrario, la funzionalità rimane invariata rispetto a Direct3D 9.
Un solo buffer depth/stencil può essere attivo alla volta; qualsiasi vista risorsa associata deve corrispondere (stesse dimensioni e dimensioni) alla visualizzazione depth/stencil. Ciò non significa che le dimensioni della risorsa devono corrispondere, ma solo che le dimensioni della vista devono corrispondere.
Per altre informazioni sui test depth-stencil, vedere esercitazione 14.
Panoramica della fusione
La fusione combina uno o più valori di pixel per creare un colore pixel finale. Il diagramma seguente illustra il processo di fusione dei dati pixel.
Concettualmente, è possibile visualizzare questo grafico di flusso implementato due volte nella fase di unione dell'output: il primo combina i dati RGB, mentre in parallelo, un secondo combina i dati alfa. Per informazioni su come usare l'API per creare e impostare lo stato di fusione, vedere Configurazione della funzionalità di fusione.
La fusione a funzione fissa può essere abilitata in modo indipendente per ogni destinazione di rendering. Esiste tuttavia un solo set di controlli blend, in modo che la stessa fusione venga applicata a tutti i RenderTarget con la fusione abilitata. I valori blend (inclusi BlendFactor) vengono sempre bloccati all'intervallo del formato di destinazione di rendering prima della fusione. Il blocco viene eseguito per ogni destinazione di rendering, rispettando il tipo di destinazione di rendering. L'unica eccezione è per i formati float16, float11 o float10 che non sono bloccati in modo che le operazioni di fusione su questi formati possano essere eseguite con almeno precisione/intervallo uguale come formato di output. Gli zeri nan e con segno vengono propagati per tutti i casi (inclusi i pesi di fusione di 0,0).
Quando si usano destinazioni di rendering sRGB, il runtime converte il colore della destinazione di rendering in uno spazio lineare prima di eseguire la fusione. Il runtime converte nuovamente il valore combinato finale nello spazio sRGB prima di salvare nuovamente il valore nella destinazione di rendering.
Differenze tra Direct3D 9 e Direct3D 10:
- In Direct3D 9, la fusione a funzione fissa può essere abilitata in modo indipendente per ogni destinazione di rendering.
- In Direct3D 10 e versioni successive è presente una descrizione dello stato blend; pertanto, è possibile impostare un valore di fusione per tutte le destinazioni di rendering.
Dual-Source fusione colori
Questa funzionalità consente alla fase di unione di output di usare simultaneamente sia output pixel shader (o0 che o1) come input per un'operazione di fusione con la singola destinazione di rendering nello slot 0. Le operazioni di blend valide includono: aggiunta, sottrazione e revsubtract. Le opzioni di blend valide per SrcBlend, DestBlend, SrcBlendAlpha o DestBlendAlpha includono: D3D11_BLEND_SRC1_COLOR, D3D11_BLEND_INV_SRC1_COLOR, D3D11_BLEND_SRC1_ALPHA, D3D11_BLEND_INV_SRC1_ALPHA. L'equazione di fusione e la maschera di scrittura di output specificano quali componenti generano l'output del pixel shader. I componenti aggiuntivi vengono ignorati.
La scrittura in altri output di pixel shader (o2, o3 e così via) non è definita; non è possibile scrivere in una destinazione di rendering se non è associato allo slot 0. La scrittura di oDepth è valida durante la fusione di colori a doppia origine.
Per esempi, vedere fusione di output di pixel shader.
Panoramica di Multiple RenderTargets
È possibile usare un pixel shader per eseguire il rendering in almeno 8 destinazioni di rendering separate, tutte identiche (buffer, Texture1D, Texture1DArray e così via). Inoltre, tutte le destinazioni di rendering devono avere le stesse dimensioni in tutte le dimensioni (larghezza, altezza, profondità, dimensioni della matrice, conteggi di campioni). Ogni destinazione di rendering può avere un formato di dati diverso.
È possibile usare qualsiasi combinazione di slot di destinazioni di rendering (fino a 8). Tuttavia, una visualizzazione risorse non può essere associata contemporaneamente a più slot di destinazione di rendering. Una vista può essere riutilizzata finché le risorse non vengono usate contemporaneamente.
Panoramica di Output-Write Mask
Usare una maschera di scrittura di output per controllare (per componente) quali dati possono essere scritti in una destinazione di rendering.
Panoramica della maschera di esempio
Una maschera di esempio è una maschera di copertura multisample a 32 bit che determina quali campioni vengono aggiornati nelle destinazioni di rendering attive. È consentita una sola maschera di esempio. Il mapping dei bit in una maschera di esempio agli esempi in una risorsa è definito da un utente. Per il rendering n-sample, vengono usati i primi n bit (dall'LSB) della maschera di esempio (32 bit il numero massimo di bit).
In questa sezione
Argomento | Descrizione |
---|---|
Configurazione delle funzionalità di Depth-Stencil |
Questa sezione illustra i passaggi per configurare il buffer depth-stencil e lo stato depth-stencil per la fase di unione dell'output. |
configurazione della funzionalità di fusione |
Le operazioni di fusione vengono eseguite su ogni output pixel shader (valore RGBA) prima che il valore di output venga scritto in una destinazione di rendering. Se il multicampionamento è abilitato, la fusione viene eseguita su ogni multisample; in caso contrario, la fusione viene eseguita su ogni pixel. |
di distorsione della profondità |
I poligoni coplanari nello spazio 3D possono essere visualizzati come se non siano coplanari aggiungendo una distorsione z (o distorsione della profondità) a ognuno di essi. |
Argomenti correlati
-
fasi della pipeline (Direct3D 10)