Android OpenGL ES实现简单绿幕抠图
正文
实现绿幕抠图,其实想法很简单。 这里简单粗暴的使用着色器替换。
OES Filter
直接实现在相机预览上的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; }
这里的关键是,判断颜色的范围。这里简单的认定 g>140.0 && r<128.0 && b<128.0 时为绿色。当是绿色的时候,就将其颜色换成白色。同时alpha值设置为0.0
BlendShader Filter
这个Shader是将背景的纹理,进行贴图,贴到我们扣的这部分图上。
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就是加载了两个贴图。一个是来自上面相机的FBO的OffscreenTextureId,一个是来自我们另外的背景贴图。 这段代码就算,如果是辨认到之前我们处理的区域的话,就将两个图片贴加到一起,如果是范围内,就用原来的图片。
简单的绿幕抠图很简单,只是判断到对应的颜色,然后将对应的贴图贴到这个部分上,就可以了。
最后的效果
- 屏幕中的原图
最后的效果
缺陷
边缘情况比较明显。显示比较突兀。 我们可以做的更好吗?
更多关于Android OpenGL ES绿幕抠图的资料请关注脚本之家其它相关文章!
相关文章
Android 从底部弹出Dialog(横向满屏)的实例代码
在android开发中经常会遇到底部弹出框的功能,今天小编抽时间给大家整理一个底部弹出横向满屏的dialog,需要的朋友参考下2016-11-11新浪微博第三方登录界面上下拉伸图片之第三方开源PullToZoomListViewEx(一)
PullZoomView要实现两类,一类是典型的Android ListView,另外一类是Android 的scroll view。本文先介绍PullZoomView在ListView上的实现:PullToZoomListViewEx2015-12-12浅谈Android为RecyclerView增加监听以及数据混乱的小坑
下面小编就为大家带来一篇浅谈Android为RecyclerView增加监听以及数据混乱的小坑。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-04-04Android布局控件DrawerLayout实现完美侧滑效果
这篇文章主要为大家详细介绍了Android布局控件DrawerLayout实现完美侧滑效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-08-08Flutter 利用CustomScrollView实现滑动效果
我们可以使用ListView将几个GridView组合在一起实现了不同可滑动组件的粘合,但是这里必须要设置禁止 GridView 的滑动,防止多个滑动组件的冲突。这种方式写起来不太方便,事实上 Flutter 提供了 CustomScrollView 来粘合多个滑动组件,并且可以实现更有趣的滑动效果。2021-06-06
最新评论