fase Output-Merger
La fase di unione dell'output genera il colore del pixel di cui è stato eseguito il 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 i test alfa (usando lo 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 lo stato di test alfa). 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 Configurazione delle funzionalità di Depth-Stencil. 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 per 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à, noto anche come 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 visualizzazione risorsa associata deve corrispondere (le stesse dimensioni e dimensioni) alla visualizzazione depth/stencil. Ciò non significa che le dimensioni della risorsa devono corrispondere, solo che le dimensioni della visualizzazione devono corrispondere.
Per altre informazioni sui test depth-stencil, vedere l'esercitazione 14.
Panoramica della fusione
La fusione combina uno o più valori pixel per creare un colore pixel finale. Il diagramma seguente illustra il processo coinvolto nella fusione dei dati pixel.
Concettualmente, è possibile visualizzare questo grafico di flusso implementato due volte nella fase di fusione 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 Configuring Blending Functionality .To see how to use the API to create and set blend state, see Configuring Blending Functionality.
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 (incluso 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 precisione/intervallo almeno 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 entrambi gli output del pixel shader (o0 e o1) come input per un'operazione di fusione con la singola destinazione di rendering nello slot 0. Le operazioni 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 vengono restituiti dal 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 è associata allo slot 0. La scrittura di oDepth è valida durante la fusione dei colori a doppia origine.
Per esempi, vedere Fusione degli output del pixel shader.
Panoramica di Multiple RenderTargets
È possibile usare un pixel shader per eseguire il rendering su almeno 8 destinazioni di rendering separate, tutte con lo stesso tipo (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 dei 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 visualizzazione può essere riutilizzata purché le risorse non vengano 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 di esempio, vengono usati i primi n bit (dall'LSB) della maschera di esempio (32 bit, ovvero il numero massimo di bit).
Contenuto della 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. |
Distorsione profondità |
I poligoni coplanari nello spazio 3D possono essere visualizzati come se non siano coplanari aggiungendo una distorsione z (o distorsione di profondità) a ognuno di essi. |