Condividi tramite


Frame Buffer Alpha (Direct3D 9)

La fusione alfa del buffer dei frame è leggermente diversa da alfa vertice, alfa materiale e alfa trama. I valori di trasparenza dei vertici, dei materiali e delle trame alfa vengono usati solo per la primitiva corrente e non hanno alcun effetto su altre primitive. La fusione alfa del buffer dei frame controlla il modo in cui la primitiva corrente viene combinata con i pixel esistenti nel buffer dei fotogrammi per produrre un colore pixel finale.

Quando si esegue la fusione alfa, vengono combinati due colori: un colore di origine e un colore di destinazione. Il colore di origine proviene dall'oggetto trasparente, il colore di destinazione è il colore già nella posizione del pixel. Il colore di destinazione è il risultato del rendering di un altro oggetto che si trova dietro l'oggetto trasparente, ovvero l'oggetto che sarà visibile tramite l'oggetto trasparente. La fusione alfa usa una formula per controllare il rapporto tra gli oggetti di origine e di destinazione.

Final Color = ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor 

ObjectColor è il contributo della primitiva di cui viene eseguito il rendering nella posizione in pixel corrente. PixelColor è il contributo del buffer dei fotogrammi nella posizione in pixel corrente.

Di seguito è riportato il set di fattori di fusione alfa che è possibile usare.

Fattore di modalità Blend Descrizione
D3DBLEND_ZERO (0, 0, 0, 0)
D3DBLEND_ONE (1, 1, 1, 1)
D3DBLEND_SRCCOLOR (Rs, Gs, Bs, As)
D3DBLEND_INVSRCCOLOR (1-Rs, 1-Gs, 1-Bs, 1-As)
D3DBLEND_SRCALPHA (As, As, As, As)
D3DBLEND_INVSRCALPHA (1-As, 1-As, 1-As, 1-As)
D3DBLEND_DESTALPHA (Ad, Ad, Ad, Ad)
D3DBLEND_INVDESTALPHA (1-Ad, 1-Ad, 1-Ad, 1-Ad)
D3DBLEND_DESTCOLOR (Rd, Gd, Bd, Ad)
D3DBLEND_INVDESTCOLOR (1-Rd, 1-Gd, 1-Bd, 1-Ad)
D3DBLEND_SRCALPHASAT (f, f, f, 1); f = min(As, 1-Ad)
D3DBLEND_BOTHSRCALPHA Obsoleto per DirectX 6 e versioni successive. È possibile ottenere lo stesso effetto impostando i fattori di fusione di origine e destinazione su D3DBLEND_SRCALPHA e D3DBLEND_INVSRCALPHA in chiamate separate.
D3DBLEND_BOTHINVSRCALPHA Obsoleto per DirectX 6. È possibile ottenere lo stesso effetto impostando i fattori di fusione di origine e destinazione su D3DBLEND_INVSRCALPHA e D3DBLEND_SRCALPHA in chiamate separate.
D3DBLEND_BLENDFACTOR Usare color.r, color.g, color.b e color.a ottenuto dall'impostazione D3DRS_BLENDFACTOR.
D3DBLEND_INVBLENDFACTOR Usare 1-color.r, 1-color.g, 1-color.b e 1-color.a ottenuto dall'impostazione D3DRS_BLENDFACTOR.

 

Direct3D usa lo stato di rendering D3DRS_ALPHABLENDENABLE per abilitare la fusione della trasparenza alfa. Il tipo di fusione alfa eseguita dipende dal D3DRS_SRCBLEND e D3DRS_DESTBLEND stati di rendering. Gli stati di fusione di origine e destinazione vengono usati in coppie. Il frammento di codice seguente imposta lo stato di fusione di origine su D3DBLEND_SRCCOLOR e lo stato della fusione di destinazione su D3DBLEND_INVSRCCOLOR.

// This code fragment assumes that lpD3DDevice is a 
//   valid pointer to a device.

// Enable alpha blending.
lpD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, 
                            TRUE);

// Set the source blend state.
lpD3DDevice->SetRenderState(D3DRS_SRCBLEND, 
                            D3DBLEND_SRCCOLOR);

// Set the destination blend state.
lpD3DDevice->SetRenderState(D3DRS_DESTBLEND, 
                            D3DBLEND_INVSRCCOLOR);

Questo codice esegue una fusione lineare tra il colore di origine (il colore della primitiva di cui viene eseguito il rendering nella posizione corrente) e il colore di destinazione (il colore nella posizione corrente nel buffer dei fotogrammi). L'aspetto risultante è simile al vetro colorato in quanto alcuni dei colori dell'oggetto di destinazione sembrano essere trasmessi tramite l'oggetto di origine; il resto sembra essere assorbito.

Molti di questi fattori di fusione richiedono valori alfa nella trama per funzionare correttamente. Pertanto, quando si usa il vertice o il materiale alfa, l'applicazione è limitata a quali modalità produrranno risultati interessanti.

Fusione alfa