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:
Constanta | Factorul |
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) |
Comenzi | Semnificaţ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ă |