10.3. Transparència (Alpha Blending)

L’Alpha Blending és una tècnica de gràfics per ordinador que permet fer transparent la nostra geometria. En algunes ocasions ens serà útil per a fer aparèixer geometria o fer-la desaparèixer segons ens convingui.

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