Consideriamo la seguente texture che rappresenta un campo di stelle:
Le stelle sono rappresentate in bianco rgb=(1,1,1)
mentre il fondale è rappresentato in nero rgb=(0,0,0)
. Questa particolare texture non ha un canale di alpha associato, ossia è del tutto opaca.
Ipotizziamo, come spesso accade, di non voler utilizzare la parte nera della texture, trattandola come se fosse trasparente. Per fare questo possiamo istruire lo SpriteBatch
affinché ad ogni operazione di disegno usi la quantità di colore di ciascun pixel disegnato e la sommi alla quantità di colore presente in quel punto sullo schermo. In questo modo i pixel neri risulteranno del tutto trasparenti, i pixel bianchi del tutto opachi e quelli grigi semi-trasparenti.
Per attivare questa modalità di disegno dobbiamo usare specificare la modalità di blending, ossia di mescolio tra l'immagine precedentemente disegnata su schermo ed i nuovi pixel:
sprite_batch.Begin(SpriteSortMode.Deferred, BlendState.Additive, SamplerState.LinearWrap, null, null);
abbiamo delle altre possibilità per quanto riguarda il blending, in particolare:
Modalità di blending | Descrizione |
---|---|
BlendState.Additive |
somma il nuovo disegno a quello corrente |
BlendState.AlphaBlend |
usa il canale di alpha del nuovo disegno come peso della somma pesata tra vecchio e nuovo |
BlendState.NonPremultiplied |
usa il canale di alpha del nuovo disegno come peso della somma pesata tra vecchio e nuovo, moltiplicando ulteriormente il colore del nuovo disegno per il suo canale di alpha |
BlendState.Opaque |
non mescola il nuovo disegno, trattandolo come se fosse completamente opaco |
A questo punto possiamo disegnare la texture stars varie volte, con dei source rectangle diversi per evitare che le stelle si sovrappongano, e con colori diversi:
sprite_batch.Draw(stars, new Rectangle(0, 0, 800, 480), new Rectangle(0, 0, 400, 200), Color.OrangeRed);
sprite_batch.Draw(stars, new Rectangle(0, 0, 800, 480), new Rectangle(0, 0, 800, 400), Color.Green);
sprite_batch.Draw(stars, new Rectangle(0, 0, 800, 480), new Rectangle(0, 0, 1600, 400), Color.White);
Il risultato, come desiderato, è:
in cui i tre layers di stelle (arancione, verde e bianco) sono tutti e tre visibili; senza il blending additivo, il risultato sarebbe stato:
Il terzo strato di stelle avrebbe nascosto i precedenti in quanto non trasparente.