Condividi tramite


Fase di unione dell'output (OM)

La fase di Output Merger (OM) scombina 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.

Scopo e usi

La fase Unione output (OM) è il passaggio finale per determinare quali pixel sono visibili (con test depth-stencil) e fondendo i colori dei pixel finali.

La fase OM genera il colore del pixel di cui è stato eseguito il rendering finale usando una combinazione delle opzioni seguenti:

  • Stato della pipeline
  • I dati pixel generati dagli shader pixel
  • Contenuto delle destinazioni di rendering
  • Contenuto dei buffer depth/stencil.

Panoramica di 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.

diagramma del funzionamento della fusione dei dati

Concettualmente, è possibile visualizzare questo grafico di flusso implementato due volte nella fase Unione 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. uno contro tuttiEsiste 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 perlomeno con eguale precisione/intervallo come il 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.

Fusione di colori a doppia origine

Questa funzionalità consente alla fase Unione output di usare simultaneamente gli output pixel shader (o0 e 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. 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 è consentita la scrittura in una destinazione di rendering se non è associata allo slot 0. La scrittura di oDepth è valida durante la fusione di colori a doppia origine.

Panoramica dei test depth-stencil

Un buffer depth-stencil, creato come risorsa texture, 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.

diagramma del funzionamento dei test depth-stencil

Per configurare i test depth-stencil, vedere Configurazione della funzionalità 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 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 viene detto buffering di profondità, detto anche z-buffering.

Quando i valori di profondità raggiungono la fase di unione dell'output (indipendentemente dal fatto che provengano dall'interpolazione o da un pixel shader) siano sempre bloccati: z = min(Viewport.MaxDepth,max(Viewport.MinDepth,z)) in base al formato/alla 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.

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 avere corrispondenza, bensì devono averla soltanto le dimensioni della visualizzazione .

Panoramica della maschera di campione

Una maschera di campione è una maschera di copertura multisample a 32 bit che determina quali campioni vengono aggiornati nelle destinazioni di rendering attive. È consentita una sola maschera di campione. Il mapping dei bit in una maschera campione ai campioni in una risorsa è definito da un utente. Per il rendering n-sample, vengono usati i primi n bit (dall'LSB) della maschera di campione (32 bit corrisponde al numero massimo di bit).

Input

La fase Output Merger (OM) genera il colore del pixel di cui è stato eseguito il rendering finale usando una combinazione delle opzioni seguenti:

  • Stato della pipeline
  • I dati pixel generati dagli shader pixel
  • Contenuto delle destinazioni di rendering
  • Contenuto dei buffer depth/stencil.

Output

Panoramica della maschera di scrittura output

Usare una maschera di scrittura di output per controllare (per componente) quali dati possono essere scritti in una destinazione di rendering.

Panoramica di destinazioni multiple di rendering

È 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 misure (larghezza, altezza, profondità, dimensioni della matrice, conteggi di campioni). Ogni destinazione di rendering può avere un formato 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 finché le risorse non vengono usate contemporaneamente.

In questa sezione

Argomento Descrizione

Configurazione della funzionalità 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.

 

Pipeline grafica