Corso di Elementi di Grafica Digitale Massimo De March Blending Corso di Elementi di Grafica Digitale Massimo De March Blending
Introduzione È usato per unire il colore di un dato pixel che sta per essere disegnato con il pixel che è già sullo schermo Esistono vari tipi di blending Additivo (Pixel Finale=PixelLayer1+PixelLayer2) Sottrattivo (Pixel Finale=PixelLayer1-PixelLayer2) Modulativo (Pixel Finale=PixelLayer1*PixelLayer2) Blending
Alpha Blending È un caso particolare di blending Si usa per gestire la trasparenza È il caso più usato e che esporrò Si basa sull’uso della componente Alpha del colore Blending
Alpha È il quarto componente del colore, specificato solitamente per ultimo GL_RGB viene usato per specificare il colore con 3 componenti GL_RGBA può essere usato per specificare anche l'alfa Si può usare glColor4f() anziché glColor3f() La maggior parte della gente pensa ad Alpha come all'indice di opacità del materiale 0.0 materiale completamente trasparente 1.0 materiale completamente opaco. Blending
Equazione Di Alpha Blending (Rs Sr + Rd Dr, Gs Sg + Gd Dg, Bs Sb + Bd Db, As Sa + Ad Da) r ed s specificano i pixel sorgenti e di destinazione Le componenti di D ed S sono i fattori di blending I valori più comuni per la S e la D sono (As, As, As, As) (cioè Alpha source) per la S e (1, 1, 1, 1) - (As, As, As, As) (cioè Alpha meno uno) per D Il risultato sarà: (Rs As + Rd (1 - As), Gs As + Gd (1 - As), Bs As + Bs (1 - As), As As + Ad (1 - As)) Blending
Blending in OpenGL – La Norma Si crea un colore con fattore Alpha usando: glColor4f(1.0f, 1.0f, 1.0f, 0.5f) Si applica l’equazione per il calcolo del colore: glBlendFunc(sfactor, dfactor) specifica i fattori moltiplicativi che devono essere utilizzati dalla funzione di blending. sfactor: specifica come devono essere considerate le componenti Red, Green, Blue e Alpha dei pixels sorgenti dfactor: specifica come devono essere considerate le componenti Red, Green, Blue e Alpha dei pixels di destinazione Si disattiva il depth buffer in quanto gli oggetti dietro la figura trasparente si devono vedere glDisable(GL_DEPTH_TEST) Si attiva il blending glEnable(GL_BLEND) Blending
Metodo Operativo Disegnare tutti i poligoni trasparenti (con Alpha < 1.0) dopo aver disegnato l' intera scena Disegnare nell' ordine di profondità inverso (l'oggetto più lontano per primo) Blending
Metodo Operativo - Dettagli Eseguendo il blending su due poligoni (1 e 2) in ordine differente, fornisce risultati differenti Ipotizzando che il poligono 1 è più vicino all'osservatore, il modo corretto dovrebbe disegnare prima il poligono 2 e poi il poligono 1 La luce che arriva da dietro questi due poligoni deve passare prima attraverso il poligono 2, quindi attraverso il poligono 1, prima di arrivare all'occhio dell'osservatore Blending
Metodo Operativo – L’Ottimo Ordinare i poligoni trasparenti a seconda della profondità (Depth) e disegnarli dopo che l’intera scena sia stata disegnata, col Depth Buffer attivato Blending
Blending & Texture Map Nel texture mode modulato, ogni pixel texturizzato è moltiplicato per il colore corrente. Se il colore che deve essere disegnato è (0.5, 0.6, 0.4), lo si moltiplica tante volte per il colore ottenendo (0.5, 0.6, 0.4, 0.2) (alpha si assume che sia 1.0 se non specificata). Blending
Blending & Texture Map II Il valore di Alpha che viene usato per la trasparenza può essere letto da texture map proprio come il colore. Basta inserire il componente colore Alpha nell' immagine da caricare e quindi usare GL_RGBA per il formato di colore nelle chiamate a glTexImage2D() Blending
Blending DEMOS Blending
IDirect3DDevice9, SetRenderState, State, Value Blending in Direct 3D9 Il metodo Operativo rimane lo stesso, cambiano solo le funzione per abilitare tale funzione Tutti i parametri sono impostabili tramite il metodo SetRenderState IDirect3DDevice9, SetRenderState, State, Value State: variabile da impostare (D3DRENDERSTATETYPE) Value: valore da assegnare alla variabile Blending
Blending in Direct 3D9 II D3DRENDERSTATETYPE D3DRS_ALPHABLENDENABLE D3DRS_ALPHABLENDENABLE = 27 Attiva blending D3DRS_SRCBLEND = 19 Fattori per sorgente D3DRS_DESTBLEND = 20 Fattori per destinazione D3DRS_BLENDOP = 171 Operazione di blending D3DRS_ALPHABLENDENABLE FALSE = 0 Disabilita il blending TRUE = 1 Abilita il blending D3DRS_SRCBLEND e D3DRS_DESTBLEND D3DBLEND_ZERO = 1 (0, 0, 0, 0) D3DBLEND_ONE = 2 (1, 1, 1, 1) D3DBLEND_SRCCOLOR = 3 (As, Rs, Gs, Bs) D3DBLEND_INVSRCCOLOR = 4 (1-As, 1-Rs, 1-Gs, 1-Bs) D3DBLEND_SRCALPHA = 5 (As, As, As, As) D3DBLEND_INVSRCALPHA = 6 (1-As, 1-As, 1-As, 1-As) D3DBLEND_DESTALPHA = 7 (Ad, Ad, Ad, Ad) D3DBLEND_INVDESTALPHA = 8 (1-Ad, 1-Ad, 1-Ad, 1-Ad) D3DBLEND_DESTCOLOR = 9 (Ad, Rd, Gd, Bd) D3DBLEND_INVDESTCOLOR = 10 (1-Ad, 1-Rd, 1-Gd, 1-Bd) D3DRS_BLENDOP D3DBLENDOP_ADD = 1 Somma D3DBLENDOP_SUBTRACT = 2 Sottrae D3DBLENDOP_REVSUBTRACT = 3 Sottrae fattori con ordine inverso (Dst - Src) D3DBLENDOP_MIN = 4 Min (Src, Dst) D3DBLENDOP_MAX = 5 Max (Src, Dst) Blending
Grazie per l’attenzione Blending Texture Grazie per l’attenzione Blending