Android OpenGL ES實現(xiàn)簡單綠幕摳圖
正文
實現(xiàn)綠幕摳圖,其實想法很簡單。 這里簡單粗暴的使用著色器替換。
OES Filter
直接實現(xiàn)在相機(jī)預(yù)覽上的Shader
#extension GL_OES_EGL_image_external : require precision mediump float; varying vec2 vTextureCoordinate; uniform samplerExternalOES uTexture; const float pixel = 30.0; void main() { vec4 tc = texture2D(uTexture, vTextureCoordinate); float r = tc.x * 255.0; float g = tc.y * 255.0; float b = tc.z * 255.0; if(g>140.0 && r<128.0 && b<128.0){ tc.x =1.0; tc.y =1.0; tc.z =1.0; tc.w =0.0; }else{ tc.w =1.0; } gl_FragColor = tc, 1.0; }
這里的關(guān)鍵是,判斷顏色的范圍。這里簡單的認(rèn)定 g>140.0 && r<128.0 && b<128.0 時為綠色。當(dāng)是綠色的時候,就將其顏色換成白色。同時alpha值設(shè)置為0.0
BlendShader Filter
這個Shader是將背景的紋理,進(jìn)行貼圖,貼到我們扣的這部分圖上。
precision mediump float; varying vec2 vTextureCoord; varying vec2 vExtraTextureCoord; uniform sampler2D uTexture; uniform sampler2D uExtraTexture; void main() { vec4 base = texture2D(uTexture, vTextureCoord); vec4 overlay = texture2D(uExtraTexture, vExtraTextureCoord); vec4 outputColor; if(base.r==1.0 && base.g==1.0 && base.b==1.0 && base.a==0.0){ outputColor.r = base.a*base.r + overlay.r * (1.0 - base.a); outputColor.g = base.a*base.g + overlay.g * (1.0 - base.a); outputColor.b = base.a*base.b + overlay.b * (1.0 - base.a); outputColor.a = base.a; }else{ outputColor.r = base.r; outputColor.g = base.g; outputColor.b = base.b; outputColor.a = base.a; } gl_FragColor = outputColor; }
這個shader就是加載了兩個貼圖。一個是來自上面相機(jī)的FBO的OffscreenTextureId,一個是來自我們另外的背景貼圖。 這段代碼就算,如果是辨認(rèn)到之前我們處理的區(qū)域的話,就將兩個圖片貼加到一起,如果是范圍內(nèi),就用原來的圖片。
簡單的綠幕摳圖很簡單,只是判斷到對應(yīng)的顏色,然后將對應(yīng)的貼圖貼到這個部分上,就可以了。
最后的效果
- 屏幕中的原圖
最后的效果
缺陷
邊緣情況比較明顯。顯示比較突兀。 我們可以做的更好嗎?
更多關(guān)于Android OpenGL ES綠幕摳圖的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android 從底部彈出Dialog(橫向滿屏)的實例代碼
在android開發(fā)中經(jīng)常會遇到底部彈出框的功能,今天小編抽時間給大家整理一個底部彈出橫向滿屏的dialog,需要的朋友參考下2016-11-11新浪微博第三方登錄界面上下拉伸圖片之第三方開源PullToZoomListViewEx(一)
PullZoomView要實現(xiàn)兩類,一類是典型的Android ListView,另外一類是Android 的scroll view。本文先介紹PullZoomView在ListView上的實現(xiàn):PullToZoomListViewEx2015-12-12Android ndk獲取手機(jī)內(nèi)部存儲卡的根目錄方法
今天小編就為大家分享一篇Android ndk獲取手機(jī)內(nèi)部存儲卡的根目錄方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08淺談Android為RecyclerView增加監(jiān)聽以及數(shù)據(jù)混亂的小坑
下面小編就為大家?guī)硪黄獪\談Android為RecyclerView增加監(jiān)聽以及數(shù)據(jù)混亂的小坑。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04Android布局控件DrawerLayout實現(xiàn)完美側(cè)滑效果
這篇文章主要為大家詳細(xì)介紹了Android布局控件DrawerLayout實現(xiàn)完美側(cè)滑效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08Flutter 利用CustomScrollView實現(xiàn)滑動效果
我們可以使用ListView將幾個GridView組合在一起實現(xiàn)了不同可滑動組件的粘合,但是這里必須要設(shè)置禁止 GridView 的滑動,防止多個滑動組件的沖突。這種方式寫起來不太方便,事實上 Flutter 提供了 CustomScrollView 來粘合多個滑動組件,并且可以實現(xiàn)更有趣的滑動效果。2021-06-06Android中Activity之間跳轉(zhuǎn)和參數(shù)傳遞的實例
本篇文章主要介紹了Android中Activity之間跳轉(zhuǎn)和參數(shù)傳遞的實例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02