Home Page Twitter Facebook Feed RSS
NotJustCode
Apri

Alphablending 1586 Visite) DirectX 11

Normalmente ogni volta che DirectX effettua un rendering, aggiorna i pixel del backbuffer con quelli del nuovo oggetto. L'alphablending è una caratteristica di DirectX che permette invece di effettuare un' operazione di confronto tra il pixel che si sta per mandare a video e quello già presente sullo schermo. In questo modo si possono creare ad esempio effetti di trasparenza impostando l'alphablending in modo che l'oggetto che si sta renderizzando sia una media tra lo sfondo e l'oggetto.

Il colore finale dei pixel dell'oggetto che si sta renderizzando rispettano questa formula

Final Color = ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor

Dove ObjectColor è il colore dell'oggetto, PixelColor quello del backbuffer in quel punto (quindi ciò che è già stato renderizzato) mentre SourceBlendFactor e DestinationBlendFactor sono le impostazioni dell'alphablending.

Una cosa molto importante da considerare in questo processo è che è il nuovo pixel a compararsi con i vecchi, non il contrario. Questo implica che viene renderizzato un vetro trasparente e poi un oggetto dietro di esso, l'oggetto non subirà blending, ed anzi non comparirà perché nascosto dal vetro. Questo perché per lo ZBuffer è un oggetto dietro ad un altro oggetto, quindi da non visualizzare. Gli oggetti che volete sottoporre ad effetti di trasparenza dovranno quindi essere ordinati dal più lontano al più vicino.

L'alphablending funziona come il rastering, quindi potete usarlo sia da HLSL che tramite la classe ID3D11BlendState.

BlendStateDescription  description;

Questa struttura descrive l'impostazione del blending. I suoi parametri sono

  • AlphaToCoverageEnable: attiva l'alpha coverage, una features introdotta in Direct3D10.
  • IndependentBlendEnable: se impostata a true ogni render target avrà un suo settaggio
  • RenderTarget: un array di 8 RenderTargetBlendDescription. Se IndipendentBlendEnable è impostata a false solo il primo verrà utilizzzato.

La struttura RenderTargetBlendDescription contiene i seguenti campi

  • IsBlendEnable: attiva e disattiva il blending. Questo elemento è un array di 8 booleani, questo perchè in DirectX esiste la possibilità di fare il rendering su più 8 superfici differenti (multiple render target). Questo sarà oggetto di futuri tutorial
  • SourceBlend: imposta il comportamento del source blend factor. Le opzioni sono quelle definite nell'enum Blend
  • DestinationBlend: imposta il comportamento del destination blend factor. Le opzioni sono quelle definite nell'enum Blend
  • BlendOperation: imposta l'operazione da eseguire. Oltre alla somma esistono anche altre possibilità di calcolo nella formula.
  • SourceBlendAlpha: source e destination blend stabiliscono il comportamento dei canali RGB. Questo invece è quello usato per il canale alpha
  • DestinationBlendAlpha: source e destination blend stabiliscono il comportamento dei canali RGB. Questo invece è quello usato per il canale alpha
  • AlphaBlendOperation: specifica l'operazione sul canale alpha
  • RenderTargetWriteMask: array che specifica quali colori saranno renderizzati su ognuno degli 8 target.

Per i blend factor i valori impostabili sono i seguenti

  • Zero : il valore è (0,0,0,0)
  • One: il valore è (1,1,1,1)
  • SourceColor : il valore è il colore RGB del nuovo pixel
  • InverseSourceColor :il valore è il colore RGB del nuovo pixel ma invertito (1-RGB)
  • SourceAlpha : il valore è l'alpha del colore del nuovo pixel
  • InverseSourceAlpha: il valore è l'alpha del colore del nuovo pixel ma invertito
  • DestinationAlpha : il valore è l'alpha del colore del pixel sullo schermo
  • InverseDestinationAlpha: il valore è l'alpha del colore del pixel sul backbuffer ma invertito
  • DestinationColor : il valore è il colore RGB del pixel sul backbuffer
  • InverseDestinationColor :il valore è il colore RGB del pixel sul backbuffer ma invertito
  • SourceAlphaSaturate: come source alpha ma il valore viene limitato tra 0 ed 1
  • BlendFactor : utilizza il valore passato al device durante l'inserimento dei settaggi
  • Inverse BlendFactor : utilizza il valore passato al device durante l'inserimento dei settaggi ma invertito

Le operazioni utilizzabili sono invece

  • Add = utilizza l'operatore di somma (Final Color = ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor)
  • Subtract = sottrae il secondo dal primo  (Final Color = ObjectColor * SourceBlendFactor - PixelColor * DestinationBlendFactor)
  • ReverseSubtract = sottrae il primo dal secondo (Final Color = - ObjectColor * SourceBlendFactor + PixelColor * DestinationBlendFactor)
  • Minimum = restituisce il minimo tra le due parti Final Color = min(ObjectColor * SourceBlendFactor , PixelColor * DestinationBlendFactor)
  • Maximum = restituisce il massimo tra le due parti Final Color = max(ObjectColor * SourceBlendFactor , PixelColor * DestinationBlendFactor)

Infine per il writemask si usano i seguenti enum

  • Red : solo rosso
  • Green :solo verde
  • Blue : solo blu
  • Alpha :solo il canale alpha
  • All : tutti e 4 i componenti

Questi possono essere combinati con l'OR logico per selezionare più opzioni contemporaneamente.

Per creare il blendstate di base

BlendStateDescription description = BlendStateDescription.Default();

_blendState = new BlendState(Device, description);

DeviceContext.OutputMerger.SetBlendState(_blendState);

 Il metodo SetBlend ha due ulteriori valori da poter impostare

  • blendFactor è un array di valori utilizzati quando si imposta blend_factor
  • sampleMask è un intero utilizzato per creare una maschera binaria

 

Vi rimando al tutorial numero 6 della serie (Github o in fondo dal primo tutorial)