OpenGLES基于自定義著色器濾鏡(一)---(2/3/4/6/9)分屏原理

一.先看看整體效果

分屏效果

????????說明:所有分屏原理操作的是片元著色器。頂點著色器不變,這里附上頂點著色器代碼苞冯,下面不在涉及頂點著色器,至于自定義頂點/片元著色器請看我以前的博客侧巨,頂點著色器如下:

????????????????attribute vec4 Position;

????????????????attributevec2TextureCoords;

????????????????varyingvec2TextureCoordsVarying;

????????????????voidmain (void) {

? ? ????????????gl_Position= Position;

? ? ????????????TextureCoordsVarying = TextureCoords;

????????????????}

二.二分屏實現(xiàn)原理

? ??? ??2.1我們先來看看二分屏片元著色器代碼:

????????????????precision highp float;--------------->定義精度舅锄,最后都寫一下

????????????????uniform sampler2D Texture;----------->紋理

????????????????varyinghighpvec2TextureCoordsVarying;---------->紋理坐標

????????????????voidmain() {

? ????????????? vec2uv = TextureCoordsVarying.xy;

? ????????????? floaty;

? ? ????????????if(uv.y >=0.0&& uv.y <=0.5) {

? ? ? ????????? ????y = uv.y +0.25;

? ? ????????????????}else{

? ? ? ? ????????????????????????y = uv.y -0.25;????????

? ? ????????????????}

? ????????????????????????????? gl_FragColor=texture2D(Texture,vec2(uv.x, y));

????????????????????}

? ??? ??所謂二分屏,就是當顯示一張圖片的時候司忱,截取紋理Y坐標下0.25-0.75的位置皇忿,為什么是0.25至0.75了,因為在我們拍攝的過程坦仍,大多圖片的核心內(nèi)容顯示在這個區(qū)域鳍烁,當然,在自定義著色器中繁扎,這個值你可以修改幔荒,但最后的效果不是很理想,你可以試一試哈锻离。我們知道紋理的坐標范圍是(0铺峭,1),流程示意圖如下:

二分屏示意圖


效果圖

三.三分屏實現(xiàn)原理

????????三分屏片元著色器代碼:

????????????????precision highp float;

????????????????uniform sampler2D Texture;

????????????????varyinghighpvec2TextureCoordsVarying;

????????????????voidmain() {

? ? ????????????????????????vec2uv = TextureCoordsVarying.xy;

? ????????????????????????? if(uv.y <1.0/3.0) {

? ? ? ? ????????????????????????uv.y = uv.y +1.0/3.0;

? ????????????????????????? }elseif(uv.y >2.0/3.0){

? ? ? ? ????????????????????????uv.y = uv.y -1.0/3.0;

? ? ????????????????????????}

? ????????????????????????? gl_FragColor=texture2D(Texture, uv);

????????????????????????????}

三分屏和二分屏的原理一樣汽纠,判斷的位置變成了1/3處:

三分屏示意圖


三分屏效果圖


四.四分屏實現(xiàn)原理

????????四分屏片元著色器代碼:

????????????????precision highp float;

????????????????uniform sampler2D Texture;

????????????????varyinghighpvec2TextureCoordsVarying;

????????????????voidmain() {

? ? ????????????????????????vec2uv = TextureCoordsVarying.xy;

? ? ????????????????if(uv.x <=0.5){

? ? ? ????????????????????? uv.x = uv.x *2.0;

? ? ????????????????????}else{

? ? ? ????????????????? uv.x = (uv.x -0.5) *2.0;

? ????????????????????? }

? ????????????? if(uv.y<=0.5) {

? ? ? ? ????????????uv.y = uv.y *2.0;

? ????????????? }else{

? ? ? ? ????????????uv.y = (uv.y -0.5) *2.0;

????????? ? }

? ? ????????????gl_FragColor=texture2D(Texture, uv);

????????????}

四分屏特點:原樣顯示圖片的大小卫键,不放大縮小,從代碼中我們可以看出虱朵,當紋理坐標(x莉炉,y)在0-0.5的時候,我們讓其乘以2碴犬,為什么絮宁?原來紋理坐標在0到0.5的時候,獲取紋理的時候服协,只能對應紋理0到0.5绍昂,使其乘以2,原本0到0.5的范圍就變成了0到1,當紋理坐標(x窘游,y)大于0.5的時候唠椭,先減去0.5,再乘以2忍饰,也使其0.5到1的范圍先變成0到0.5贪嫂,最后變成0到1,這樣艾蓝,當獲取紋理的時候力崇,無論從0到0.5的范圍,還是0.5到1的范圍赢织,都是變成獲攘裂ァ(0,1)整張圖片敌厘。究其根本原因就是改變紋理坐標獲取的紋理位置台猴。原理示意圖如下:

四分屏示意圖


四分屏效果圖

五。六分屏實現(xiàn)原理

????????六分屏片元著色器代碼:

? ??????????????precision highp float;

????????????????uniform sampler2D Texture;

????????????????varyinghighpvec2TextureCoordsVarying;

????????????????voidmain() {

? ? ????????????????????vec2uv = TextureCoordsVarying.xy;

? ? ????????????????????if(uv.x <=1.0/3.0){

? ? ? ? ????????????????????uv.x = uv.x +1.0/3.0;

? ????????????????????? }elseif(uv.x >=2.0/3.0){

? ? ? ? ????????????????????uv.x = uv.x -1.0/3.0;

? ????????????????????? }

? ? ????????????????????if(uv.y <=0.5){

? ? ? ? ????????????????????uv.y = uv.y +0.25;

? ????????????????????? }else{

? ? ? ? ????????????????uv.y = uv.y -0.25;

? ? ????????????????????}

? ? gl_FragColor=texture2D(Texture, uv);

}

? ??????????你看懂了2/3/4分屏原理俱两,6和9分屏原理就很簡單了饱狂,6分屏實現(xiàn)原理就是同時改變紋理坐標的值,x坐標取三分之一處宪彩,Y坐標取0.5之處休讳,主要是看你的圖拍你的樣子,原理示意圖參照2/3/4分屏


六分屏效果圖

六.九分屏實現(xiàn)原理

????????九分屏片元著色器代碼:

? ??????????????precision highp float;

????????????????uniform sampler2D Texture;

????????????????varyinghighpvec2TextureCoordsVarying;

????????????????voidmain() {

? ? ????????????vec2uv = TextureCoordsVarying.xy;

? ? ? ? ? ? ? ? ?if(uv.x <1.0/3.0) {

? ? ? ? ? ? ? ? ? ? ?uv.x = uv.x *3.0;

? ????????????? }elseif(uv.x <2.0/3.0) {

? ? ? ????????????? uv.x = (uv.x -1.0/3.0) *3.0;

? ? ????????????}else{

? ? ? ????????????? uv.x = (uv.x -2.0/3.0) *3.0;

? ? ????????}

? ????????? if(uv.y <=1.0/3.0) {

? ? ? ????????????? uv.y = uv.y *3.0;

? ? ????????????????}elseif(uv.y <2.0/3.0) {

? ? ? ????????????? uv.y = (uv.y -1.0/3.0) *3.0;

? ????????????????? }else{

? ? ? ? ????????????uv.y = (uv.y -2.0/3.0) *3.0;

? ? ????????????}

? ? ????????????gl_FragColor=texture2D(Texture, uv);

}

? ??????九分屏原理和四分屏原理一樣尿孔,只是x俊柔,y分屏的地方選擇的是1/3,2/3處活合,相關流程示意圖雏婶,請參照4分屏示意圖


九分屏效果圖

最后附上代碼地址:鏈接: https://pan.baidu.com/s/1bzJpt2Nq6h7DGpfx8PQYdQ 提取碼: cck8

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市白指,隨后出現(xiàn)的幾起案子留晚,更是在濱河造成了極大的恐慌,老刑警劉巖告嘲,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错维,死亡現(xiàn)場離奇詭異,居然都是意外死亡橄唬,警方通過查閱死者的電腦和手機赋焕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仰楚,“玉大人隆判,你說我怎么就攤上這事犬庇。” “怎么了蜜氨?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵械筛,是天一觀的道長。 經(jīng)常有香客問我,道長秆吵,這世上最難降的妖魔是什么孽锥? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮攀涵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己煞赢,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布哄孤。 她就那樣靜靜地躺著照筑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘦陈。 梳的紋絲不亂的頭發(fā)上凝危,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音晨逝,去河邊找鬼蛾默。 笑死,一個胖子當著我的面吹牛捉貌,可吹牛的內(nèi)容都是我干的支鸡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼趁窃,長吁一口氣:“原來是場噩夢啊……” “哼牧挣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起醒陆,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瀑构,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后统求,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體检碗,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年码邻,在試婚紗的時候發(fā)現(xiàn)自己被綠了折剃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡像屋,死狀恐怖怕犁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤奏甫,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布戈轿,位于F島的核電站,受9級特大地震影響阵子,放射性物質(zhì)發(fā)生泄漏思杯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一挠进、第九天 我趴在偏房一處隱蔽的房頂上張望色乾。 院中可真熱鬧,春花似錦领突、人聲如沸暖璧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澎办。三九已至,卻和暖如春金砍,著一層夾襖步出監(jiān)牢的瞬間局蚀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工捞魁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留至会,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓谱俭,卻偏偏與公主長得像奉件,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子昆著,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354