JavaScript WebGL 圖片透明處理

引子

JavaScript WebGL 使用圖片疑惑點中提到兩張圖片疊加,默認情況下峡扩,即使有透明的區(qū)域也不會透過看到。現(xiàn)在就來看這個透明的處理庇绽。

關(guān)于透明

說到透明,在顏色編碼中由 Alpha 通道負責(zé)橙困,透明度存儲方式有:

  • Premultiplied Alpha :表示顏色信息在存儲的時候會將透明信息與 RGB 相乘瞧掺,比如 RGB 是 (1, 1, 1),透明度為 0.5 纷宇,那么存儲時為:(0.5, 0.5, 0.5, 0.5) 。
  • Non-premultiplied Alpha : 表示 RGB 與透明信息分別單獨存儲蛾方,不會相乘像捶,比如 RGB 是 (1, 1, 1),透明度為 0.5 桩砰,那么存儲時為:(1, 1, 1, 0.5)

WebGL 紋理預(yù)處理使用 pixelStorei 方法指定顏色透明處理方式拓春,如果想要使用 Premultiplied Alpha 方式:

gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true);

WebGL 透明處理方式之一是使用 α 混合。

α 混合

α 混合是使用 α 值(RGBA 中的 A)混合兩個以上物體顏色的過程亚隅。在這個場景下硼莽,繪制了多個紋理且有重疊的地方,假設(shè)先繪制紋理 C 煮纵,然后再繪制紋理 D 懂鸵,那么紋理 D 就是源顏色(source color), 紋理 C 就是目標顏色(destination color)行疏。

想要使用該功能匆光,首先要開啟:

gl.enable(gl.BLEND);

然后指定混合的方式有:

blendEquation

void blendEquation(enum mode)

mode 取值有:

  • FUNC_ADD : 源顏色分量與目標顏色分量相加。
  • FUNC_SUBTRACT : 源顏色分量減去目標顏色分量酿联。
  • FUNC_REVERSE_SUBTRACT : 目標顏色分量減去源顏色分量终息。

這個方法只指定了混合的方式,如果要看到最終的效果贞让,需要跟 blendFuncblendFuncSeparate 方法配合一起使用周崭。看看這篇文章最下面的偽代碼邏輯會加深理解喳张。

這是示例续镇。

blendEquationSeparate

void blendEquationSeparate(enum modeRGB, enum modeAlpha)

這個方法的兩個參數(shù)取值與 blendEquation 方法參數(shù)取值一樣,區(qū)別是把顏色分成了 RGB 和 A 單獨的兩部分销部。

blendFunc

void blendFunc(enum sfactor, enum dfactor);

  • sfactor : 常量磨取,源顏色在混合顏色中的權(quán)重因子人柿,比 dfactor 多一個值 SRC_ALPHA_SATURATE
  • dfactor : 常量忙厌,目標顏色在混合顏色中的權(quán)重因子凫岖。

混合顏色的計算方法是:

混合后顏色 = 源顏色 * sfactor + 目標顏色 * dfactor

這里計算針對的是每個顏色分量,下面設(shè)定 S 代碼源顏色逢净,D 代表目標顏色哥放,各個分量用小寫 rgba 表示,下面看看權(quán)重因子部分常量取值:

常量 R 分量 G 分量 B 分量 A 分量
ZERO 0 0 0 0
ONE 1 1 1 1
SRC_COLOR S.r S.g S.b S.a
ONE_MINUS_SRC_COLOR (1-S.r) (1-S.g) (1-S.b) (1-S.a)
DST_COLOR D.r D.g D.b D.a
ONE_MINUS_DST_COLOR (1-D.r) (1-D.g) (1-D.b) (1-D.a)
SRC_ALPHA S.a S.a S.a S.a
ONE_MINUS_SRC_ALPHA (1-S.a) (1-S.a) (1-S.a) (1-S.a)
DST_ALPHA D.a D.a D.a D.a
ONE_MINUS_DST_ALPHA (1-D.a) (1-D.a) (1-D.a) (1-D.a)

還有可以配合方法 blendColor(red, green, blue, alpha) 的常量取值:

常量 R 分量 G 分量 B 分量 A 分量
CONSTANT_COLOR red green blue alpha
ONE_MINUS_CONSTANT_COLOR (1-red) (1-green) (1-blue) (1-alpha)
CONSTANT_ALPHA alpha alpha alpha alpha
ONE_MINUS_CONSTANT_ALPHA (1-alpha) (1-alpha) (1-alpha) (1-alpha)

如果不使用 blendColor 指定分量爹土,也是可以使用這些常量甥雕,因為有默認值:

gl.getParameter(gl.BLEND_COLOR) // 默認對應(yīng)分量都是 0

關(guān)于第一個參數(shù)多的取值 SRC_ALPHA_SATURATE

常量 R 分量 G 分量 B 分量 A 分量
SRC_ALPHA_SATURATE min(S.a, 1-D.a) min(S.a, 1-D.a) min(S.a, 1-D.a) 1

下面這些是示例:

  • 沒有使用 blendColor 方法的示例
  • 配合使用 blendColor 方法的示例胀茵。

blendFuncSeparate

void blendFuncSeparate(enum srcRGB, enum dstRGB, enum srcAlpha, enum dstAlpha)

這個方法參數(shù)取值與 blendFunc 方法參數(shù)取值一樣社露,區(qū)別是把顏色分成了 RGB 和 A 單獨的兩部分。

轉(zhuǎn)載:https://segmentfault.com/a/1190000041293517

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琼娘,一起剝皮案震驚了整個濱河市峭弟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脱拼,老刑警劉巖瞒瘸,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異熄浓,居然都是意外死亡情臭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門赌蔑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來俯在,“玉大人,你說我怎么就攤上這事娃惯〕祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵石景,是天一觀的道長劈猿。 經(jīng)常有香客問我,道長潮孽,這世上最難降的妖魔是什么揪荣? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮往史,結(jié)果婚禮上仗颈,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好挨决,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布请祖。 她就那樣靜靜地躺著,像睡著了一般脖祈。 火紅的嫁衣襯著肌膚如雪肆捕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天盖高,我揣著相機與錄音慎陵,去河邊找鬼。 笑死喻奥,一個胖子當著我的面吹牛席纽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播撞蚕,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼润梯,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甥厦?” 一聲冷哼從身側(cè)響起纺铭,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎矫渔,沒想到半個月后彤蔽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摧莽,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡庙洼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了镊辕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片油够。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖征懈,靈堂內(nèi)的尸體忽然破棺而出石咬,到底是詐尸還是另有隱情,我是刑警寧澤卖哎,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布鬼悠,位于F島的核電站,受9級特大地震影響亏娜,放射性物質(zhì)發(fā)生泄漏焕窝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一维贺、第九天 我趴在偏房一處隱蔽的房頂上張望它掂。 院中可真熱鬧,春花似錦溯泣、人聲如沸虐秋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽客给。三九已至用押,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間起愈,已是汗流浹背只恨。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抬虽,地道東北人官觅。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像阐污,于是被迫代替她去往敵國和親休涤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容