cocos creater关于blend,关于预乘premultiply alpha,关于图片白边灰边的问题
cocos中使用的資源圖片,如下圖:
這張圖中心圓和右上角不透明度為50%的圓使用flashcc2015繪制,左上角圓和左下角不透明度為50%的圓使用pscc2017繪制。在ccc中的表現(xiàn)如下(一下混合因子僅對源的改變,目標因子均為ONE_MINUS_SRC_ALPHA)
1.src_alpha:
2.one:
換圖,由原圖做預乘處理后的效果如下(即勾選Premultiply Alpha),同樣做兩種混合模式的測試:
1.src_alpha:
2.one:
以上測試基于 V1.2 Bug 圖片周圍出現(xiàn)一圈白邊是什么情況 35中開發(fā)團隊的解釋
讀取圖像信息發(fā)現(xiàn)兩款軟件對于透明通道的處理不太一致,參考unity一篇問答Alpha is Transparency 82灰邊的問題是因為紋理縮放邊緣插值計算導致,cocos2d—x中精靈的blend源默認應該是one,(因為手動設置src-alpha會有灰邊,設置one沒有變化,未具體考證,有誤還請指正)
那么。。。問題來了,如何正確設置混合模式或者需要修改那些參數(shù)才能使紋理正常且準確的渲染,我不認為將全部素材做預乘然后全部設置one是個理智的解決方案,還請團隊相關(guān)大大解釋一下ccc對于這部分的設置和原理,以及這樣做的出于什么考慮,為何要和cocos2d-x不同?one more question,為何編輯器中混合模式的組合是無法正確顯示的,比如zero zero,是因為web的缺陷嗎?
cocos引擎開發(fā)團隊 panda 的回復:
兩位分析的都挺深入的,關(guān)于引擎中設計的表述也都是正確的。
Cocos2d-x 中的設置更加智能,默認對圖片進行 WebGL 預乘,如果發(fā)現(xiàn)貼圖是已經(jīng)預乘過的,那么 Sprite 就使用 ONE 作為 blend src,否則使用 SRC_ALPHA。這里帶來的問題是,貼圖切換,用戶手動修改 Blend function 的沖突,cocos2d-x 在切換貼圖的時候,會自動根據(jù)貼圖的預乘屬性重新設置 Blend function,而不管用戶是否手動修改過,這里就有潛在的 bug 可能。
除此之外,圖片是否預乘還決定了 opacityModifyRGB 的值,如果用戶隨意修改這個值也會造成效果的問題。
我們比較介意的是,這里耦合了 blend function 和預乘兩者的邏輯。在做 Creator 的時候,我們希望讓用戶更自由得選擇是否對貼圖進行 GL 預乘,以及選擇使用什么樣的 blend function。在之后的版本中,會擴展 Texture 的 inspector,讓用戶選擇是否自動對貼圖進行 GL 預乘。
aboutda:
1.混合不是簡單的乘除法,預乘了就得除掉,沒有這個道理
2.預乘紋理要對應{ONE,ONE_MINUS_ALPHA},非預乘要對應{SRC_ALPHA,ONE_MINUS_ALPHA}
3.預乘和最終效果沒有必然關(guān)系,不同混合運算,最終效果自然不同
4.alpha是0乘啥都是0,它邊界是啥跟它本身沒關(guān)系,白邊是半透明區(qū)域
4.白邊問題你算一下就知道了,你貼的網(wǎng)站有公式,簡單講你沒有預乘圖片,就使用ONE作為源,相比SRC_ALPHA少乘了alpha,導致最終像素值變大了,也就是泛白了
附:
本文是將creater中的問答抄錄,原問答:
https://forum.cocos.org/t/creater-blend-premultiply-alpha/43260/16
總結(jié)
以上是生活随笔為你收集整理的cocos creater关于blend,关于预乘premultiply alpha,关于图片白边灰边的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue+spreadjs+后台Java实
- 下一篇: 微软windows logo配色rgb