Cocos2d中使用颜色混合:加算,减算
轉自http://blog.sina.com.cn/s/blog_7a2ffd5c0100xtid.html
CCSprite有一個ccBlendFunc類型的blendFunc_結構體成員,可以用來設置描繪時的顏色混合方案。ccBlendFunc包含了一個src和一個dst,分別表示目標和源的運算因子。
????如果我們對一個Sprite使用setBlendFunc方法,如:
?????????????[Sprite setBlendFunc:(ccBlendFunc){GL_ONE,GL_ZERO} ];
????會以這個Sprite作為源,Sprite所在位置的其它像素作為目標,進行混合運算:
????????源的RGBA變量:Rs,Gs,Bs,As;
????????目標的RGBA:??Rd,Gd,Bd,Ad;
????????源的各個運算因子:??N_Rs,N_Gs,N_Bs,N_As;
????????目標的各個運算因子:???N_Rd,N_Gd,N_Bd,N_Ad;
混合后的RGBA為:(Rs*N_Rs+ Rd* N_Rd,Gs*N_Gs+ Gd* N_Gd,
????????????????????????????????Bs*N_Bs+ Bd* N_Bd,As*N_As+ Ad* N_Ad)
???其中的運算因子包括:
?????????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值作為因子
?
????我們可以在CCSprite的init方法中看到,默認的狀態下使用GL_ONE,GL_ONE_MINUS_SRC_ALPHA這兩個參數,這也是我們看到的情況,Sprite會覆蓋下面的描繪,但如果有透明的地方,則會顯示下面的色值。讓我們看一下說使用各個參數的效果:
????0:不改變混合,使用默認的情況:
?????
????1:如果設置glBlendFunc(GL_ONE,GL_ZERO),?表面完全使用源顏色,即和不混合一樣的效果,但是如果Sprite本身有透明的地方,則透明的地方會變成黑色。因為此時不顯示目標的顏色。即使透明度為0也沒有意義。
????2:如果設置glBlendFunc(GL_ZERO, GL_ONE),表示不使用源顏色,那么該Sprite便不被畫出來。
??
????3:使用ALPHA相關的因子,會根據透明度來計算,比如透明度高的顏色占較大比重等。如默認情況。
?附:
| 常數 | 相關因子 | 融合因子結果 |
| 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) |
轉載于:https://www.cnblogs.com/linyawen/p/3334156.html
總結
以上是生活随笔為你收集整理的Cocos2d中使用颜色混合:加算,减算的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 清除XCode缓存和生成文件
- 下一篇: 关于64位WIN7下正确建立JAVA开发