A Directx3D s'usa una equació per a
crear la il·lusió de la transparència. Per
entendre-la, primer detallem la llegenda d’ítems que surten a l’equació:
- (FC) – Color Final
- (SP) - Píxel Origen
- (DP) – Píxel Destí
- (SBF) - Factor de barreja origen
- (DBF) - Factor de barreja destí
- (FA) – Alfa Final
- (SA) – Alfa Origen
- (DA) – Alfa Destí
- (+) - Operador Binari descrit a continuació
- (X) – Matrius de Multiplicació creuada.
Les dues operacions
que generen transparència a Directx11 són les següents:
- (FC) = (SP) (X) (SBF) (+) (DP) (X) (DPF)
- (FA) = (SA)(SBF) (+) (DA)(DBF)
La primera equació
serveix per a calcular el color de la transparència i la segona per a calcular
el seu valor alfa.
Pel que fa a
l’operador binari pot ser una de les instruccions següents:
Jugar amb ells ens
dóna una idea del que fan, tot i que el nom és molt aclaridor. Bàsicament, cadascun
ens proporcionarà un efecte bàsic diferent sobre la transparència.
El factor de
barreja (D3D11_BLEND) ens proporciona
diferents efectes avançats sobre la transparència. A continuació es llisten
cadascun d’ells.
Al següent enllaç
es descriuen cadascun d’ells:
Per
a poder crear transparència és necessari crear un descriptor de barreja (D3D11_BLEND_DESC).
Al
següent enllaç s’expliquen els diferents paràmetres a usar en aquesta estructura:
10.3.1. Problemes amb la transparència en Directx11
A continuació s’expliquen problemes referents amb la transparència en
Directx11. Aquests ocorren quan es tenen diversos objectes transparents a
l’escena i van lligats a l’ordre en que es renderitzen.
És important renderitzar primer tots els objectes visibles (no transparents)
de l’escena primer, i a continuació renderitzar els transparents. Si no es fes
així, el càlcul del color de la transparència es faria
només amb alguns dels objectes de l’escena no transparents, i no tots, de
manera que el resultat final seria fals, fins i tot quedaria poc realista.
Quan es tenen molts objectes a l’escena 3D, més d’un de transparent i més
d’un de sòlid, el millor per evitar problemes de
color de transparència és crear un vector segons la profunditat de l’escena,
des del punt més proper al punt més llunyà segons l’eix de profunditat, i
renderitzar els objectes en aquest ordre, alhora que primer els sòlids i a
continuació els transparents.
10.3.2. Exemple de transparència
El següent exemple
mostrarà amb transparència les capses de l’exemple del capítol 8, el
d’il·luminació.
El primer que cal
fer un cop generat el projecte on treballarem, serà definir les variables
globals. Definim l’estat de la nostra geometria, i dues variables per mantenir
els dos estats de rasterizació, en direcció a les agulles del rellotge i al
revés, això ho entendrem més endavant.
ID3D11BlendState* Transparency;
ID3D11RasterizerState* CCWcullMode;
ID3D11RasterizerState* CWcullMode;
A continuació creem
una funció per a netejar tots els elements usats en el projecte.
Tenint a mà
l’exemple d’il·luminació, ja comentat abans, sota de la funció init cal afegir les funcions referents
a la transparència.
Per a poder veure
la part del darrere de les capses un cop siguin transparents i evitar així un
error que podria donar l’alpha blending,
afegim aquest codi que bàsicament canvia la forma de representar els
objectes segons on siguin, de manera que la seva visualització sigui sempre
l’adient. Això dependrà de l’escena, en el cas d’aquest exemple, interessa
fer-ho.
La funció de pintat
(DrawScene) quedaria amb aquest aspecte:
Es pot entendre
molt millor al codi font adjunt, el qual conté comentaris de que es fa en cada
cas. Cal apreciar, però, que s’han afegit funcions respecte l’exemple d’on
partim, el d’il·luminació, que fan referència a la transparència i a la manera
de rasterizar la geometria.
Les primeres línies
referents a la transparència són les següents:
La primera fa
referència a quanta opacitat volem de cada color. Aquí marquem que la volem un
75% invisible pels colors RGB i totalment per l’alfa.
La segona línia
decideix si està actiu o no l’estat de blending.
Ara mateix està actiu. Es pot desactivar tornant a cridar la instrucció
canviant els dos primers paràmetres per NULL i el tercer deixant-lo així 0xffffffff.
La darrera línia
mescla l’estat de blending creat per
nosaltres amb el del pipeline gràfic
de manera que la nostra creació tingui efecte a l’escena final.
No hay comentarios:
Publicar un comentario