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 JNI處理圖片實現(xiàn)黑白濾鏡的方法
這篇文章主要介紹了Android JNI處理圖片實現(xiàn)黑白濾鏡的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-01-01
Android?Jetpack組件Lifecycle源碼解析
這篇文章主要為大家介紹了Android?Jetpack組件Lifecycle源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Android ViewPager與radiogroup實現(xiàn)關(guān)聯(lián)示例
本篇文章主要介紹了Android ViewPager與radiogroup實現(xiàn)關(guān)聯(lián)示例,具有一定的參考價值,有興趣的可以了解一下。2017-03-03
功能強(qiáng)大的Android滾動控件RecyclerView
這篇文章主要為大家詳細(xì)介紹了功能強(qiáng)大的Android滾動控件RecyclerView,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
ViewPager+Fragment實現(xiàn)側(cè)滑導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了ViewPager+Fragment實現(xiàn)側(cè)滑導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-05-05
Android 5.0及以上編程實現(xiàn)屏幕截圖功能的方法
這篇文章主要介紹了Android 5.0及以上編程實現(xiàn)屏幕截圖功能的方法,結(jié)合實例形式分析了Android5.0以上實現(xiàn)截圖功能的相關(guān)類、函數(shù)及權(quán)限控制等操作技巧,需要的朋友可以參考下2018-01-01

