关于滤镜尝试
首先,上流程:
效果图如下,我们想要实现这样的一个效果,大致的流程是:获取摄像机成像的数据,然后对摄像机成像数据进行修改,最终渲染于屏幕上。
就获取摄像机成像数据而言,利用摄像机的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
上一篇: 不感觉有点儿晚了吗