关于滤镜尝试(二)

首先,上流程:

效果图如下,我们想要实现这样的一个效果,大致的流程是:获取摄像机成像的数据,然后对摄像机成像数据进行修改,最终渲染于屏幕上。

就获取摄像机成像数据而言,利用摄像机的api可以获取对应数据并绑定到surfacetexture中。

camera!!.setPreviewTexture(cameraSurfaceTexture)
// mCamera.setPreviewDisplay(holder);
// mCamera.setPreviewCallback(this);

camera!!.startPreview()

android一般有两种方式,一是使用自封装的类实现(TextureView),二是使用通用的YUV渲染方式。

(surfacetexture原理参考https://www.jianshu.com/p/b19a0f49d4ac

将摄像机图像渲染与纹理绑定

利用updateTexUmage进行渲染,刷新纹理绑定的数据内容,渲染后进行纹理的滤镜效果渲染,最后sleep 30ms,重复过程,实现摄像机帧率的刷新

***摄像头采集速度一般在30fps左右,过度的渲染会造成内容等待,过慢会导致画面卡顿***

 

我们接下来主要看下如何将摄像机纹理输出到屏幕上:即,上文中的selectedFilter.draw方法。

这里是纹理绑定后的着色器部分代码(摄像机着色器),主要是对两个参数进行赋值,一个是顶点坐标数据,一个是纹理坐标数据。这里还有个ichannel0,这个数据类型是samplerExternalOES,是一种摄像机特有的类型,它其实也是一个sampler2D。

以上,这个时候其实可以去绘制出来画面,即原始相机画面。但是因为我们还要加自己的倒影滤镜,所以还需要修改。

查阅发现,需要将当前原始画面渲染到一张texture上面(即离屏渲染FBO到一张图片RTT),然后再次去走着色器流程。

先看FBO流程:

激活一张纹理并绑定帧缓冲数据:

执行绘制。

到此,图片其实已经渲染出来了。

然后我们再次走着色器以让它实现倒影效果

以之前渲染好的纹理单元为原数据进行渲染,shader为:

上图的一连串sin是一个通用的白噪声的随机数方法,用以随机水平纹理

最后,进行面片光栅化处理,固定渲染管线流程绘制出最终画面。

此时,仍有不少疑问,有空再看下,大致整理为:

为何不能一次性用shader去将倒影效果加好呢?没必要再走一次

surfacetexture/glsurfaceview/textview是如何绘制渲染的。

为何draw就能直接在屏幕上绘制出来呢?两次draw是不是意味着其实每帧都在屏幕上渲染了两次,岂不是一种浪费?

shadertoy百度了下没办法直接在android中使用,猜测gc方法缺少应该有所固定替代性的,所以因该还有不了解的内容,需要继续查阅资料。

性能分析这块还没做过,有待分析

FBO中有render缓存没用,具体它有何作用呢?

最近抖音上的那个横线扫描定格特效的实现是啥原理呢?能否实现

有待补充

 

附,手写流程图:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值