圖層混合模式 & glBlendFunc & Xfermodes

  • 圖層混合模式介紹

Fireworks 8 混合模式詳解
Blending modes in Adobe Photoshop

  • glBlendFunc介紹

Android OpenGLES2.0(十八)——輕松搞定Blend顏色混合
終端圖像處理系列 - OpenGL混合模式的使用
LearnOpenGL-混合

glBlendFunc(GLenum src_factor, GLenum dest_factor)
color_result = color_ src ?src_factor + color_dest?dest_factor
dest指的是當(dāng)前儲存在顏色緩沖中的顏色向量历等,即目標(biāo)色撒顿,底色消请,本色莉擒。底部的背景赊堪。
src指的是新的萨惑,要用于合成的紋理的顏色,即源色白群,用于合成的資源竟痰。上層的前景签钩。

比較常規(guī)的配置應(yīng)該是

// norm模式
glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

注意:
OpenGL里執(zhí)行完glBlendFunc后掏呼,記得恢復(fù)之前的glIsEnabled和glBlendFunc. 這點容易被忘記導(dǎo)致各種渲染異常。

  • 用OpenGL Shader實現(xiàn)圖層混合模式

OpenGL(十七)Photoshop blend算法 與 圖層混合模式
終端圖像處理系列 - 圖像混合模式的Shader實現(xiàn)(有介紹3D場景下的混合方案)(對應(yīng)源碼)
Shader 中的顏色混合模式(Blend Mode)
postprocessing
glsl-blend
GIMP對Blend的處理
w3c的混合模式標(biāo)準(zhǔn)

  • 不用shader就能實現(xiàn)的PS的混合模式:

Multiply 正片疊底
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA);
(AE在正片疊底時對透明度的處理邏輯不詳边臼,所以只適用于不透明的兩個圖層混合的情況哄尔。圖層有透明度時假消,實際效果可能會和AE的有差異)

Darken 變暗
glBlendFunc(GL_ONE, GL_ONE) glBlendEquation(GL_FUNC_MIN)
(Android 不支持GL_FUNC_MIN柠并,iOS可以用GL_MIN_EXT)

Lighten 變亮
glBlendFunc(GL_ONE,GL_ONE) glBlendEquation(GL_FUNC_MAX)
(Android 不支持GL_FUNC_MAX,iOS可以用GL_MAX_EXT)

Difference 差值
glBlendFunc(GL_ONE, GL_ONE) glBlendEquation(GL_FUNC_SUBTRACT)
(只適用src的RGBA值比dest的RGBA值都大的情況富拗,否則還是需要用shader計算兩張圖的RGBA差值的絕對值)

Screen 屏幕
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)
或glBlendFunc(GL_MINUS_DST_COLOR, GL_ONE)
兩者結(jié)果一樣

Linear Dodge(Add) 線性減淡(增加)
glBlendFunc(GL_ONE, GL_ONE)
(BodyMoving插件只支持Add, 不支持Linear Dodge)

Normal 常規(guī)混合
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

OpenGL的硬件支持的高級混合模式

高級混合模式對應(yīng)的shader實現(xiàn)

  • 考慮透明度的shader代碼示例
    // 柔光
    const char *gl_fra_SoftLight = SHADER_SRC(
        precision highp float;

        varying vec2 vTexCoord;
        uniform sampler2D uTexture;
        uniform sampler2D uTexture2;
        

            float blend(const float x, const float y) {
                return (y < 0.5) ?
                       (2.0 * x * y + x * x * (1.0 - 2.0 * y)) :
                       (sqrt(x) * (2.0 * y - 1.0) + 2.0 * x * (1.0 - y));
            }

            void main() {
                vec4 front = texture2D(uTexture2, vTexCoord);
                vec4 back = texture2D(uTexture, vTexCoord);

                vec3 dest = vec3(blend(back.r, front.r), blend(back.g, front.g),
                                 blend(back.b, front.b));
                float alpha = max(front.a, back.a);
                float mixAlpha = front.a*back.a;
                vec3 remainColor = back.rgb * (1.0 - front.a)*back.a + front.rgb * (1.0 - back.a)*front.a;
                gl_FragColor = vec4((dest*mixAlpha + remainColor), alpha);
            }
    );
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臼予,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啃沪,更是在濱河造成了極大的恐慌粘拾,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件创千,死亡現(xiàn)場離奇詭異缰雇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)追驴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門械哟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人殿雪,你說我怎么就攤上這事暇咆。” “怎么了丙曙?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵爸业,是天一觀的道長。 經(jīng)常有香客問我亏镰,道長扯旷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任索抓,我火速辦了婚禮钧忽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纸兔。我一直安慰自己惰瓜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布汉矿。 她就那樣靜靜地躺著崎坊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洲拇。 梳的紋絲不亂的頭發(fā)上奈揍,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天曲尸,我揣著相機(jī)與錄音,去河邊找鬼男翰。 笑死另患,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛾绎。 我是一名探鬼主播昆箕,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼租冠!你這毒婦竟也來了鹏倘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤顽爹,失蹤者是張志新(化名)和其女友劉穎纤泵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體镜粤,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡捏题,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肉渴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片公荧。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖黄虱,靈堂內(nèi)的尸體忽然破棺而出稚矿,到底是詐尸還是另有隱情,我是刑警寧澤捻浦,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布晤揣,位于F島的核電站,受9級特大地震影響朱灿,放射性物質(zhì)發(fā)生泄漏昧识。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一盗扒、第九天 我趴在偏房一處隱蔽的房頂上張望跪楞。 院中可真熱鬧,春花似錦侣灶、人聲如沸甸祭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽池户。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間校焦,已是汗流浹背赊抖。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留寨典,地道東北人氛雪。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像耸成,于是被迫代替她去往敵國和親报亩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355