vraie canvas
3 éléments superposés avec des couleurs
2 éléments superposés avec des couleurs
clearcolor et fragcolor, mais le blending n'est pas activé
capture écran = 0.86 0.56 0.81 source : fragcolor = 0.80 0.20 0.698 0.50 destination : canvas 0.608 0.608 0.608 0.20 co = Cs*as+Cb*ab*(1-as) co = [0.80, 0.20, 0.698][i]*0.50 + [0.608,0.608,0.608][i]*0.2*0.5; co=[0.461, 0.161, 0.41]; ao = 0.50 + 0.20*(1-0.50); ao =0.6 compositing avec le fond blanc co = [0.461, 0.161, 0.41][i] + [1,1,1][i]*1*(1-0.6); co= 0.861 0.561 0.81 Dans le calcul, on voit que le clearcolor - gl.clearColor(0.2,0.4,0.5,0.8) - n'est pas pris en compte. C'est parce que le blending n'est pas activé.
on enlève le clearColor. ça ne change pas la couleur du point.
Sans blending, cette couleur est composée avec celle du canvas.
La couleur du point est la même que précédemment
gl.clearColor(0.2,0.4,0.5,0.8)
gl.drawArrays(gl.POINTS, 0, 2);
couleur 1er point : 0.8 0.2 0.698 0.5
couleur 2e point : 0.6 0.4 0.2 0.6
source : couleur 2e point : 0.6 0.4 0.2 0.6
destination : couleur canvas 0.608 0.608 0.608 0.20
co = [ 0.6 , 0.4 , 0.2, ][i]*0.6 + [0.61,0.61,0.61][i]*0.20*(1-0.6);
co = [0.41, 0.29, 0.17]
ao = 0.6 + 0.2 * ( 1- 0.6);
ao = 0.68;
composition avec le fond blanc
co_fond = [0.41, 0.29, 0.17][i] + [1,1,1][i]*1*(1-0.68);
co_fond = 0.73 0.61 0.49
quand il n'y a pas de blending, le dernier point est composé avec le fond
gl.blendFuncSeparate(gl.ONE,gl.ZERO,gl.ZERO,gl.ONE);
gl.clearColor(0.0,1.0,0.0,0.7);
gl.fragColor 0.8, 0.2, 0.698 , 0.5
gl.drawArrays(gl.POINTS, 0, 1);
copie ecran
0.86 0.44 0.79
Cs = [0.8 , 0.2 , 0.7][i];
as = 0.5;
Cb= [ 0,1,0];
ab=0.7;
blending :
RGB = Cs * ONE + Cb * ZERO
= Cs
A = as * ZERO + ab * ONE
= ab
Cs <= (1-ab)*Cs + ab*B
<= (1-ab)*Cs + ab*Cs
(Cs,ab) sur ( 1 1 1 1)
co=[0.8, 0.2, 0.698 ][i]*0.7+[1,1,1][i]*1.0*(1-0.7)
co = 0.86 0.44 0.786
pareil que copieecran
gl.blendFuncSeparate(gl.ONE,gl.ONE,gl.ZERO,gl.ONE); gl.clearColor(0.0, 0.4, 0.0, 0.7); gl.fragColor 0.8, 0.2, 0.698 , 0.5 gl.drawArrays(gl.POINTS, 0, 1); copiie ecran 0.86 0.72 0.79 Cs = [0.8, 0.2, 0.7][i] as = 0.5; Cb = [0, 0.4, 0][i] ab = 0.7 blending RGB = Cs + Cb = [0.8, 0.6, 0.7][i] A = ab = 0.7 ([0.8, 0.6, 0.7][i], 0.7) sur (1,1,1,1) co = [0.8, 0.6, 0.7][i]*0.7 + [1,1,1][i]*1.0*(1-0.7) co = 0.86 0.72 0.79
gl.blendFuncSeparate(gl.DST_ALPHA,gl.ONE_MINUS_SRC_ALPHA,gl.ZERO,gl.ONE);
gl.clearColor(0.0, 0.4, 0.0, 0.7);
gl.fragColor 0.8, 0.2, 0.698 , 0.5
gl.drawArrays(gl.POINTS, 0, 1);
copiie ecran
0.694 0.541 0.643
Cs = [0.8, 0.2, 0.7][i]
as = 0.5;
Cb = [0, 0.4, 0][i]
ab = 0.7
blending
RGB = (sourceColor * srcRGB) + (destinationColor * dstRGB)
RGB = Cs * ab + Cb*(1-as)
= [0.8, 0.2, 0.7][i] *0.7 + [0, 0.4, 0][i]*(1-0.5)
= [0.56, 0.34, 0.49][i]
A = (sourceAlpha * srcAlpha) + (destinationAlpha * dstAlpha)
A = ab
= 0.7
( [0.56, 0.34, 0.49][i], 0.7) sur (1,1,1,1)
co = [0.56, 0.34, 0.49][i]*0.7 + [1,1,1][i]*1*(1-0.7)
= 0.69 0.538 0.643
gl.blendFuncSeparate(gl.DST_ALPHA,gl.ONE_MINUS_SRC_ALPHA,gl.ZERO,gl.SRC_ALPHA);
gl.clearColor(0.0, 0.4, 0.0, 0.7);
gl.fragColor 0.8, 0.2, 0.698 , 0.5
gl.drawArrays(gl.POINTS, 0, 1);
copiie ecran
0.847 0.773 0.824
on vérifie avec la théorie
Cs = [0.8, 0.2, 0.7];//
as = 0.5;//
Cb = [0, 0.4, 0];//
ab = 0.7;//
//RGB = (sourceColor * srcRGB) + (destinationColor * dstRGB)
//RGB = sourceColor * DST_ALPHA + destinationColor * ONE_MINUS_SRC_ALPHA
RGB = Cs[i] * ab + Cb[i] * (1-as);//
RGB = [0.56, 0.34 , 0.49];
// A = (sourceAlpha * srcAlpha) + (destinationAlpha * dstAlpha)
// A = destinationAlpha * SRC_ALPHA
A = ab * as
A = 0.7 * 0.5
A = 0.35
enfin, on compose (RGB,A) sur le fond blanc
co = RGB * A + 1-A
co = [0.56, 0.34 , 0.49][i]*0.35 + 1-0.35
co = [0.846, 0.769, 0.8215]
// PAREIL QUE COPIE ECRAN YEEEEES
en dehors du point à gauche en bas, la couleur est "simple alpha composited"
la source étant le clearColor, la destination, la couleur CSS du canvas
gl.blendFuncSeparate(
gl.SRC_ALPHA,
gl.ONE_MINUS_SRC_ALPHA,
gl.ONE,
gl.ONE_MINUS_SRC_ALPHA);
gl.clearColor(0.0, 0.4, 0.0, 0.7);
gl.fragColor 0.8, 0.2, 0.698 , 0.5
gl.drawArrays(gl.POINTS, 0, 1);
copiie ecran
....
on vérifie avec la théorie
Cs = [0.8, 0.2, 0.7];//
as = 0.5;//
Cb = [0, 0.4, 0];//
ab = 0.7;//
//RGB = (sourceColor * srcRGB) + (destinationColor * dstRGB)
//RGB = sourceColor * SRC_ALPHA + destinationColor * ONE_MINUS_SRC_ALPHA
RGB = Cs[i] * as + Cb[i] * (1-as);//
RGB = [0.4, 0.3 , 0.35];
// A = sourceAlpha * ONE + destinationAlpha * (1-AS)
A = as + ab * (1-as)
A = 0.5 + 0.7 * 0.5
A = 0.85
enfin, on compose (RGB,A) sur le fond blanc
co = RGB * A + 1-A
co = [0.4, 0.3, 0.35][i]*0.85 + 1-0.85
co = [0.49, 0.405, 0.4475]
// PAREIL QUE COPIE ECRAN YEEEEES
en dehors du point à gauche en bas, la couleur est "simple alpha composited"
la source étant le clearColor, la destination, la couleur CSS du canvas