Folosirea componentei "alpha"

Cu comanda glColor din OpenGL se poate preciza şi componenta "alpha", pe lângă componentele de bază: red, green, blue. Această componentă are efect asupra desenului.
La generarea unui desen se pot cere calcule suplimentare pentru a "amesteca" o culoare care se desenează cu ceea ce este deja desenat pe ecran. Aceste calcule sunt activate/dezactivate prin:
glEnable(GL_BLEND)
glDisable(GL_BLEND)
Componenta "alpha" precizează o măsură a opacităţii suprafeţei (invers transparenţei). Dacă o suprafaţă e complet transparentă, atunci se văd prin ea toate detaliile. Dacă este transparentă numai cu un anumit grad, atunci rezultatul este o combinaţie a ceea ce este deja desenat şi suprafaţa care se desenează.

Presupunem că se desenează un pixel (sursa) peste un pixel deja desenat (destinaţie), fiecare având o anumită culoare:
sursa: (RS,GS,BS,AS)
destinaţia: (RD,GD,BD,AD)

La desenare se iau anumiţi factori cu care se înmulţeşte fiecare componentă de culoare, factori pentru sursă şi factori pentru destinaţie. Considerăm că aceşti factori sunt:
sursa: (FRS, FGS, FBS, FAS)
destinaţia: (FRD, FGD, FBD, FAD)

După "amestecarea" culorilor dintre sursă şi destinaţie va rezulta o culoare obţinută prin formula:
(RS*FRS+RD*FRD, GS*FGS+GD*FGD, BS*FBS+BD*FBD, AS*FAS+AD*FAD)
Observaţie: Valorile care depăşesc 1 sunt înlocuite cu 1.

Dacă este activată "amestecarea" culorilor (opţiunea "blending"), atunci factorii amintiţi mai sus se precizează cu funcţia:

glBlendingFunc(factorSursa, factorDestinatie)
Argumentele sunt precizate prin constantele din tabelul următor, nu toate valorile au semnificaţie atât pentru sursă cât şi pentru destinaţie:
ConstantaFactorul
GL_ZERO(0, 0, 0, 0)
GL_ONE(1, 1, 1, 1)
GL_DST_COLOR(RD, GD, BD, AD)
GL_SRC_COLOR(RS, GS, BS, AS)
GL_ONE_MINUS_DST_COLOR(1, 1, 1, 1)-(RD, GD, BD, AD)
GL_ONE_MINUS_SRC_COLOR(1, 1, 1, 1)-(RS, GS, BS, AS)
GL_DST_ALPHA(AD, AD, AD, AD)
GL_SRC_ALPHA(AS, AS, AS, AS)
GL_ONE_MINUS_DST_ALPHA(1, 1, 1, 1)-(AD, AD, AD, AD)
GL_ONE_MINUS_SRC_ALPHA(1, 1, 1, 1)-(AS, AS, AS, AS)
GL_SRC_ALPHA_SATURATE(f, f, f, 1); f=min(ASs, 1-AD)

Observaţii:
ComenziSemnificaţie
glBlendFunc(GL_ONE, GL_ZERO)
Se desenează numai sursa, vechea culoare este înlocuită (nu are efect)
glBlendFunc(GL_ZERO, GL_ONE)
Desenarea sursei nu are efect, rămâne culoarea veche
glBlendFunc(GL_ONE, GL_ZERO);
desen1;
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
desen2;
alpha*srcColor+destColor
primul desen este luat în întregime, al doilea desen se ia cu un coeficient alpha
gl.glBlendFunc(gl.GL_ONE, gl.GL_ZERO);
desen1;  //un "sablon pt. desenare
//pixeli cu culoarea alba=masca (se deseneaza), 
//    sau neagra (nu se deseneaza)
gl.glBlendFunc(gl.GL_DST_COLOR, gl.GL_ZERO);
desen2;
primul desen este luat în întregime
cs=(Rs,Gs,Bs) = culoarea unui pixel care se scrie (sursa)
cd=(Rd,Gd,Bd) = culoarea de fond a pixelului peste care se scrie (destinatia)
=>cn=(Rs*Rd,Gs*Gd,Bs*Bd) = culoarea nouă a pixelului
dacă cd=albă=(1,1,1)=masca => cn=(Rs,Gs,Bs) => peste mască se desenează imaginea nouă
dacă cd=neagră=(0,0,0) => cn=(0,0,0) => peste exterior la masca nu se desenează (rămâne negru)
gl.glBlendFunc(gl.GL_ONE, gl.GL_ZERO);
desen1;//pixeli cu culoarea albă sau neagră
gl.glBlendFunc(gl.GL_ONE_MINUS_DST_COLOR, gl.GL_ZERO);
desen2;
cs=(Rs,Gs,Bs) = culoarea unui pixel care se scrie
cd=(Rd,Gd,Bd) = culoarea de fond a pixelului peste care se scrie
=>cn=(Rs*(1-Rd),Gs*(1-Gd),Bs*(1-Bd)) = culoarea nouă a pixelului
dacă cd=albă=(1,1,1)=masca => cn=(0,0,0) => peste mască nu se desenează
dacă cd=neagră=(0,0,0) => cn=(R,G,B) => peste exterior la mască se desenează imaginea nouă