当前位置: 移动技术网 > 网络运营>服务器>Linux > 关于滤镜尝试(二)

关于滤镜尝试(二)

2020年10月30日  | 移动技术网网络运营  | 我要评论
首先,上代码:
首先,上流程:

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

就获取摄像机成像数据而言,利用摄像机的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缓存没用,具体它有何作用呢?

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

有待补充

 

附,手写流程图:

 

 

 

本文地址:https://blog.csdn.net/l304847944/article/details/109306281

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网