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