欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

关于滤镜尝试

程序员文章站 2022-04-02 08:05:28
首先,上代码:...
首先,上流程:

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

关于滤镜尝试

就获取摄像机成像数据而言,利用摄像机的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

相关标签: android shader