OpenGLES濾鏡開發(fā)匯總 —— 仿抖音幻覺濾鏡

首先智袭,我們觀察抖音的幻覺濾鏡变抽,可以看到有兩個過程組成础拨。主紋理以及上一幀紋理組成,主紋理經(jīng)過LUT顏色映射得到绍载。如果拍攝的視頻是靜態(tài)的诡宗,則由于上一幀和當前主紋理是圖像是一樣的,那樣整個畫面就重疊了击儡,此時是看不出幻覺效果的塔沃,只有LUT顏色映射之后的圖像效果。我們了解了整個過程的構建曙痘,接下來我們來看看如何實現(xiàn):

1芳悲、拿上一幀與主圖像進行混合:

precision mediump float;
varying vec2 textureCoordinate;
uniform sampler2D inputTexture;     // 當前輸入紋理
uniform sampler2D inputTextureLast; // 上一次的紋理

// 分RGB通道混合,不同顏色通道混合值不一樣
const lowp vec3 blendValue = vec3(0.1, 0.3, 0.6);

void main() {
    // 當前紋理顏色
    vec4 currentColor = texture2D(inputTexture, textureCoordinate);
    // 上一輪紋理顏色
    vec4 lastColor = texture2D(inputTextureLast, textureCoordinate);
    // 將兩者混合
    gl_FragColor = vec4(mix(lastColor.rgb, currentColor.rgb, blend), currentColor.w);
}

備注:這里對RGB通道使用不同的值進行線性混合得到边坤,這里可以任意自己調(diào)整

2名扛、LUT映射函數(shù)
我們可以看到圖像是經(jīng)過濾鏡處理得到的,這個過程我們采用一個lut濾鏡進行處理茧痒,加載lut函數(shù)如下:

vec4 getLutColor(vec4 textureColor, sampler2D lookupTexture) {
    mediump float blueColor = textureColor.b * 63.0;

    mediump vec2 quad1;
    quad1.y = floor(floor(blueColor) / 8.0);
    quad1.x = floor(blueColor) - (quad1.y * 8.0);

    mediump vec2 quad2;
    quad2.y = floor(ceil(blueColor) / 8.0);
    quad2.x = ceil(blueColor) - (quad2.y * 8.0);

    highp vec2 texPos1;
    texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
    texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

    highp vec2 texPos2;
    texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
    texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

    lowp vec4 newColor1 = texture2D(lookupTexture, texPos1);
    lowp vec4 newColor2 = texture2D(lookupTexture, texPos2);

    lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
    vec4 color = vec4(newColor.rgb, textureColor.w);
    return color;
}

3肮韧、經(jīng)過顏色映射之后,我們得到最終的fragment shader,如下所示:

precision mediump float;
varying vec2 textureCoordinate;
uniform sampler2D inputTexture;     // 當前輸入紋理
uniform sampler2D inputTextureLast; // 上一次的紋理
uniform sampler2D lookupTable;      // 顏色查找表紋理

// 分RGB通道混合弄企,不同顏色通道混合值不一樣
const lowp vec3 blendValue = vec3(0.1, 0.3, 0.6);

// 計算lut映射之后的顏色值
vec4 getLutColor(vec4 textureColor, sampler2D lookupTexture) {
    mediump float blueColor = textureColor.b * 63.0;

    mediump vec2 quad1;
    quad1.y = floor(floor(blueColor) / 8.0);
    quad1.x = floor(blueColor) - (quad1.y * 8.0);

    mediump vec2 quad2;
    quad2.y = floor(ceil(blueColor) / 8.0);
    quad2.x = ceil(blueColor) - (quad2.y * 8.0);

    highp vec2 texPos1;
    texPos1.x = (quad1.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
    texPos1.y = (quad1.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

    highp vec2 texPos2;
    texPos2.x = (quad2.x * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.r);
    texPos2.y = (quad2.y * 0.125) + 0.5/512.0 + ((0.125 - 1.0/512.0) * textureColor.g);

    lowp vec4 newColor1 = texture2D(lookupTexture, texPos1);
    lowp vec4 newColor2 = texture2D(lookupTexture, texPos2);

    lowp vec4 newColor = mix(newColor1, newColor2, fract(blueColor));
    vec4 color = vec4(newColor.rgb, textureColor.w);
    return color;
}

void main() {
    // 當前紋理顏色
    vec4 currentColor = texture2D(inputTexture, textureCoordinate);
    // 上一輪紋理顏色
    vec4 lastColor = texture2D(inputTextureLast, textureCoordinate);
    // lut映射的顏色值
    vec4 lutColor = getLutColor(currentColor, lookupTable);
    // 將lut映射之后的紋理與上一輪的紋理進行線性混合
    gl_FragColor = vec4(mix(lastColor.rgb, lutColor.rgb, blendValue ), currentColor.a);
}

4超燃、綁定紋理。我們需要對紋理進行綁定拘领,操作如下:

    @Override
    public void onDrawFrameBegin() {
        super.onDrawFrameBegin();

        // 綁定上一次紋理
        GLES30.glActiveTexture(GLES30.GL_TEXTURE1);
        GLES30.glBindTexture(getTextureType(), mLastTexture);
        GLES30.glUniform1i(mLastTextureHandle, 1);

        // 綁定lut紋理
        GLES30.glActiveTexture(GLES30.GL_TEXTURE2);
        GLES30.glBindTexture(getTextureType(), mLookupTable);
        GLES30.glUniform1i(mLastTextureHandle, 2);
    }

    /**
     * 設置上一次紋理id
     * @param lastTexture
     */
    public void setLastTexture(int lastTexture) {
        mLastTexture = lastTexture;
    }

    /**
     * 設置lut紋理id
     * @param lookupTableTexture
     */
    public void setLookupTable(int lookupTableTexture) {
        mLookupTable = lookupTableTexture;
    }
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末意乓,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子约素,更是在濱河造成了極大的恐慌届良,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圣猎,死亡現(xiàn)場離奇詭異士葫,居然都是意外死亡,警方通過查閱死者的電腦和手機送悔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門慢显,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人欠啤,你說我怎么就攤上這事荚藻。” “怎么了跪妥?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵鞋喇,是天一觀的道長。 經(jīng)常有香客問我眉撵,道長侦香,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任纽疟,我火速辦了婚禮罐韩,結果婚禮上,老公的妹妹穿的比我還像新娘污朽。我一直安慰自己散吵,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布蟆肆。 她就那樣靜靜地躺著矾睦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炎功。 梳的紋絲不亂的頭發(fā)上枚冗,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音蛇损,去河邊找鬼赁温。 笑死坛怪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的股囊。 我是一名探鬼主播袜匿,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稚疹!你這毒婦竟也來了居灯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤内狗,失蹤者是張志新(化名)和其女友劉穎穆壕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體其屏,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年缨该,在試婚紗的時候發(fā)現(xiàn)自己被綠了偎行。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡贰拿,死狀恐怖蛤袒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情膨更,我是刑警寧澤妙真,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站荚守,受9級特大地震影響珍德,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矗漾,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一锈候、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧敞贡,春花似錦泵琳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛔垢,卻和暖如春击孩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啦桌。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工溯壶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留及皂,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓且改,卻偏偏與公主長得像验烧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子又跛,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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

  • 在 app 內(nèi)利用各種圖形算法可以對圖片進行一些變換碍拆,這樣的效果也稱為“濾鏡”,濾鏡效果大致可以分為以下幾類: 獨...
    Yasic閱讀 8,586評論 3 36
  • 上一篇文章中慨蓝,我大概介紹了一下短視頻的拍攝感混,主要就是音視頻的加減速。這篇文章我將介紹下抖音視頻特效的實現(xiàn)礼烈,廢話不多...
    Mr_villain閱讀 29,621評論 42 314
  • 問答1.text-align: center的作用是什么弧满,作用在什么元素上?能讓什么元素水平居中 屬性規(guī)定元素中的...
    湖衣閱讀 271評論 0 0
  • 時間真的過得飛快募谎,絲毫沒有為誰停留的打算,一晃S小姐悄悄步入了31歲的高齡阴汇,工作按部就班数冬,喜歡的東西從來都不便...
    淺笑舒眉閱讀 168評論 0 1
  • 感恩天地萬物,給予我食物搀庶,陽光拐纱,水,和我的生活所需地来! 感恩裝修師傅的辛勤勞作戳玫,進程順利,認真負責未斑,祈愿他們早日完工...
    rainlove2011閱讀 302評論 0 0