cocos creator 中sprite有個有意思的屬性
| Blend Factor | 當前圖像混合模式 |
| Dst Blend Factor | 背景圖像混合模式讼昆,和上面的屬性共同作用倦踢,可以將前景和背景 Sprite 用不同的方式混合渲染带斑,
這兩個的結(jié)合確實可以產(chǎn)生不少有意義的效果。
##Blend公式原理
OpenGL中的混合是通過這個方程來實現(xiàn)的:
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.默認的狀態(tài)下使用GL_ONE,GL_ONE_MINUS_SRC_ALPHA這兩個參數(shù)尽楔,這也是我們看到的情況投储,Sprite會覆蓋下面的描繪
2.設(shè)置glBlendFunc(GL_ONE,GL_ZERO),?表面完全使用源顏色阔馋,即和不混合一樣的效果玛荞,但是如果Sprite本身有透明的地方,則透明的地方會變成黑色呕寝。因為此時不顯示目標的顏色勋眯。即使透明度為0也沒有意義。
2:如果設(shè)置glBlendFunc(GL_ZERO, GL_ONE),表示不使用源顏色客蹋,那么該Sprite便不被畫出來塞蹭。
常數(shù)相關(guān)因子融合因子結(jié)果
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
核心算法 就是 根據(jù)透明度來計算 如果因子為0就是不顯示,為1就是完全顯示嚼酝,中間值就是有透明度兩張圖片有融合
根據(jù)公式推敲下渲染的結(jié)果:
1. 當目標和源因子都設(shè)置為GL_ZERO浮还,無論混合方程怎樣設(shè)置,最終肯定啥也沒有闽巩。
2. 當源設(shè)置為GL_ONE钧舌,目標設(shè)置為GL_ZERO,方程設(shè)置為加還是減涎跨,最終應(yīng)該渲染的就是目標的顏色洼冻,也就是之渲染出金幣。
3. 當源設(shè)置為GL_ONE隅很,目標設(shè)置為GL_SRC_COLOR撞牢,方程設(shè)置為加,根據(jù)公式最終顏色=(目標顏色*目標因子)+(源顏色*源因子)叔营,得到最終有顏色的區(qū)域必定是源alpha不為0的區(qū)域屋彪,因為源是作為目標因子的坎弯,源*目標慧起,最終源中alpha為0的區(qū)域,這個結(jié)果也為0挠铲,也就是最終的結(jié)果區(qū)域透明了婴谱。
其他的都根據(jù)公式了蟹但。最終不同參數(shù)下的混合結(jié)果所示,1谭羔、2华糖、3分別于圖1、2瘟裸、3對應(yīng)客叉。
一個可以直接看效果的網(wǎng)站
https://www.andersriggelsen.dk/glblendfunc.php
一篇參考文章
http://www.reibang.com/p/174dbf898684zhe
混合公式
https://blog.csdn.net/u010468553/article/details/79786497
https://www.cnblogs.com/kefeiGame/p/8202624.html
算法解釋比較好的網(wǎng)站
https://blog.csdn.net/junzia/article/details/76580379