Configurazione della funzionalità di fusione
Le operazioni di fusione vengono eseguite su ogni output del pixel shader (valore RGBA) prima che il valore di output venga scritto in un target di rendering. Se la multicampionatura è abilitata, la fusione viene eseguita su ogni multicampionatura; altrimenti, la fusione viene eseguita su ogni pixel.
- Creare lo stato di fusione
- Associare lo stato blend
- argomenti avanzati di fusione
- argomenti correlati
Creare lo stato di fusione
Lo stato blend è una raccolta di stati utilizzati per controllare la fusione. Questi stati (definiti in D3D11_BLEND_DESC1) vengono usati per creare l'oggetto stato blend chiamando ID3D11Device1::CreateBlendState1.
Ad esempio, ecco un esempio molto semplice di creazione dello stato blend che disabilita la fusione alfa e non usa alcuna maschera pixel per componente.
ID3D11BlendState1* g_pBlendStateNoBlend = NULL;
D3D11_BLEND_DESC1 BlendState;
ZeroMemory(&BlendState, sizeof(D3D11_BLEND_DESC1));
BlendState.RenderTarget[0].BlendEnable = FALSE;
BlendState.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
pd3dDevice->CreateBlendState1(&BlendState, &g_pBlendStateNoBlend);
Questo esempio è simile all'esempio HLSLWithoutFX10.
Associare lo stato blend
Dopo aver creato l'oggetto stato di fusione, associare l'oggetto stato di fusione alla fase di fusione dell'output chiamando ID3D11DeviceContext::OMSetBlendState.
float blendFactor[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
UINT sampleMask = 0xffffffff;
pd3dDevice->OMSetBlendState(g_pBlendStateNoBlend, blendFactor, sampleMask);
Questa API accetta tre parametri: l'oggetto stato blend, un fattore di fusione a quattro componenti e una maschera di esempio. È possibile passare NULL per l'oggetto stato blend per specificare lo stato di fusione predefinito o passare un oggetto stato blend. Se hai creato l'oggetto dello stato di fusione con D3D11_BLEND_BLEND_FACTOR o D3D11_BLEND_INV_BLEND_FACTOR, puoi passare un fattore di fusione per modulare i valori per il pixel shader, il target di rendering o entrambi. Se non è stato creato l'oggetto stato blend con D3D11_BLEND_BLEND_FACTOR o D3D11_BLEND_INV_BLEND_FACTOR, è comunque possibile passare un fattore di fusione non NULL, ma la fase di fusione non usa il fattore di fusione; il runtime archivia il fattore di fusione ed è possibile chiamare successivamente ID3D11DeviceContext::OMGetBlendState per recuperare il fattore di fusione. Se si passa NULL, il runtime usa o archivia un fattore di fusione uguale a { 1, 1, 1, 1 }. La maschera di esempio è una maschera definita dall'utente che determina come campionare la destinazione di rendering esistente prima di aggiornarla. La maschera di campionamento predefinita è 0xffffffff che definisce il campionamento dei punti.
Nella maggior parte degli schemi di buffering di profondità, il pixel più vicino alla fotocamera è quello che viene disegnato. Quando configurare lo stato dello stencil di profondità, il membro DepthFunc di D3D11_DEPTH_STENCIL_DESC può essere qualsiasi D3D11_COMPARISON_FUNC. In genere, si desidera DepthFunc essere D3D11_COMPARISON_LESS, in modo che i pixel più vicini alla fotocamera sovrascriveranno i pixel dietro di essi. Tuttavia, a seconda delle esigenze dell'applicazione, è possibile usare qualsiasi altra funzione di confronto per eseguire il test di profondità.
Argomenti avanzati sulla fusione
- alpha-to-coverage
- output pixel shader di fusione
Alfa-To-Coverage
Alpha-to-coverage è una tecnica di multicampionamento che è più utile per situazioni come fogliame denso in cui ci sono diversi poligoni sovrapposti che utilizzano la trasparenza alfa per definire i bordi all'interno della superficie.
È possibile utilizzare il membro AlphaToCoverageEnable di D3D11_BLEND_DESC1 o D3D11_BLEND_DESC per attivare o disattivare la conversione da parte del runtime del componente .a (alfa) del registro di output SV_Target0 dal pixel shader in una maschera di copertura a n-step (dato un RenderTarget). Il runtime esegue un'operazione AND di questa maschera con la copertura campione tipica del pixel nella primitiva (oltre alla maschera di campione) per determinare quali campioni devono essere aggiornati in tutti i RenderTarget attivi.
Se il pixel shader restituisce SV_Coverage, il runtime disabilita l'alpha-to-coverage.
Nota
Nel multicampionamento, il runtime condivide una sola copertura per tutti i RenderTargets. Il fatto che il runtime legga e converta .a dall'output SV_Target0 alla copertura quando AlphaToCoverageEnable è TRUE non modifica il valore .a che passa al frullatore in RenderTarget 0 (se un RenderTarget viene impostato lì). In generale, se si abilita l'alpha-to-coverage, non si influisce sul modo in cui tutti gli output di colore dei pixel shader interagiscono con RenderTargetattraverso lo stadio di fusione dell'output , ad eccezione del fatto che il runtime esegue un'operazione di AND della maschera di copertura con la maschera alpha-to-coverage. Alpha-to-coverage funziona indipendentemente dal fatto che il runtime possa effettuare il blending di RenderTarget o si utilizza il blending su RenderTarget.
L'hardware grafico non specifica esattamente come converte esattamente il pixel shader SV_Target0.a (alfa) in una maschera di copertura, ad eccezione del fatto che alfa di 0 (o meno) deve eseguire il mapping a nessuna copertura e alfa pari a 1 (o superiore) deve essere mappato alla copertura completa (prima che il runtime esegua un'operazione di AND con copertura primitiva effettiva). Man mano che alfa passa da 0 a 1, la copertura risultante dovrebbe in genere aumentare monotonicamente. Tuttavia, l'hardware potrebbe eseguire il dithering dell'area per fornire una migliore quantizzazione dei valori alfa al costo della risoluzione spaziale e del rumore. Un valore alfa di NaN (Non un numero) comporta l'assenza di copertura (zero) della maschera.
La tecnica alpha-to-coverage viene usata tradizionalmente anche per la trasparenza del retino o per definire silhouette dettagliate per sprite che altrimenti sarebbero opachi.
Fusione degli Output dello Shader di Pixel
Questa funzionalità consente alla fusione di output di usare simultaneamente entrambi gli output del pixel shader come origini di input per un'operazione di fusione con il singolo target di rendering nello slot numero 0.
Questo esempio prende due risultati e li combina in un unico passaggio, fondendone uno nella destinazione con una moltiplicazione e l'altro con una somma.
SrcBlend = D3D11_BLEND_ONE;
DestBlend = D3D11_BLEND_SRC1_COLOR;
In questo esempio, il primo output del pixel shader viene configurato come colore di origine e il secondo output come fattore di fusione per ciascun componente di colore.
SrcBlend = D3D11_BLEND_SRC1_COLOR;
DestBlend = D3D11_BLEND_INV_SRC1_COLOR;
In questo esempio viene illustrato il modo in cui i fattori di fusione devono corrispondere allo shader swizzles:
SrcFactor = D3D11_BLEND_SRC1_ALPHA;
DestFactor = D3D11_BLEND_SRC_COLOR;
OutputWriteMask[0] = .ra; // pseudocode for setting the mask at
// RenderTarget slot 0 to .ra
Insieme, i fattori di fusione e il codice shader implicano che il pixel shader è necessario per restituire almeno o0.r e o1.a. I componenti di output aggiuntivi possono essere restituiti dallo shader, ma verrebbero ignorati, un minor numero di componenti produrrebbe risultati non definiti.
Argomenti correlati