
cocos creator 中sprite有个有意思的属性
| Blend Factor | 当前图像混合模式 |
| Dst Blend Factor | 背景图像混合模式,和上面的属性共同作用,可以将前景和背景 Sprite 用不同的方式混合渲染,
这两个的结合确实可以产生不少有意义的效果。
##Blend公式原理
OpenGL中的混合是通过这个方程来实现的:
C¯sourceC¯source:源颜色向量。这是源自纹理的颜色向量。
C¯destinationC¯destination:目标颜色向量。这是当前储存在颜色缓冲中的颜色向量。
FsourceFsource:源因子值。指定了alpha值对源颜色的影响。
FdestinationFdestination:目标因子值。指定了alpha值对目标颜色的影响。

类似这样

GL_ONE:1.0
GL_ZERO:0.0
GL_SRC_ALPHA:源的Alpha值作为因子
GL_DST_ALPHA:目标Alpha作为因子
GL_ONE_MINUS_SRC_ALPHA:1.0减去源的Alpha值作为因子
GL_ ONE_MINUS_DST_ALPHA:1.0减去目标的Alpha值作为因子
glBlendFunc(GL_ZERO, GL_ONE) 第一个表示源因子,第二个表示目标因子
1.默认的状态下使用GL_ONE,GL_ONE_MINUS_SRC_ALPHA这两个参数,这也是我们看到的情况,Sprite会覆盖下面的描绘
2.设置glBlendFunc(GL_ONE,GL_ZERO), 表面完全使用源颜色,即和不混合一样的效果,但是如果Sprite本身有透明的地方,则透明的地方会变成黑色。因为此时不显示目标的颜色。即使透明度为0也没有意义。

2:如果设置glBlendFunc(GL_ZERO, GL_ONE),表示不使用源颜色,那么该Sprite便不被画出来。
常数相关因子融合因子结果
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_SRC_ALPHA 源因子或目的因子 (As,As,As,As)
GL_ONE_MINUS_SRC_ALPHA 源因子或目的因子(1,1,1,1)-(As,As,As,As)
GL_DST_ALPHA 源因子或目的因子 (Ad,Ad,Ad,Ad)
GL_ONE_MINUS_DST_ALPHA 源因子或目的因子 (1,1,1,1)-(Ad,Ad,Ad,Ad)
GL_SRC_ALPHA_SATURATE 源因子 (f,f,f,1); f=min(As,1-Ad
核心算法 就是 根据透明度来计算 如果因子为0就是不显示,为1就是完全显示,中间值就是有透明度两张图片有融合
根据公式推敲下渲染的结果:
1. 当目标和源因子都设置为GL_ZERO,无论混合方程怎样设置,最终肯定啥也没有。
2. 当源设置为GL_ONE,目标设置为GL_ZERO,方程设置为加还是减,最终应该渲染的就是目标的颜色,也就是之渲染出金币。
3. 当源设置为GL_ONE,目标设置为GL_SRC_COLOR,方程设置为加,根据公式最终颜色=(目标颜色*目标因子)+(源颜色*源因子),得到最终有颜色的区域必定是源alpha不为0的区域,因为源是作为目标因子的,源*目标,最终源中alpha为0的区域,这个结果也为0,也就是最终的结果区域透明了。
其他的都根据公式了。最终不同参数下的混合结果所示,1、2、3分别于图1、2、3对应。



一个可以直接看效果的网站
https://www.andersriggelsen.dk/glblendfunc.php
一篇参考文章
https://www.jianshu.com/p/174dbf898684zhe
混合公式
https://blog.csdn.net/u010468553/article/details/79786497
https://www.cnblogs.com/kefeiGame/p/8202624.html
算法解释比较好的网站
https://blog.csdn.net/junzia/article/details/76580379
网友评论