屏幕图像捕捉:

  • Shader的GrabPass

    GrabPass可以很方便地捕获当前渲染时刻的FrameBuffer中的图像。

    其原理就是从当前FrameBuffer中copy一份纹理,通过SetTexture的方式设置纹理。

    至于GrabPass的性能问题,一般认为是对FrameBuffer 进行的一些pixel copy operations造成的,

    具体Unity是怎么实现的,不得而知。

    GrabPass { } 不带参数的 默认名字为 "_GrabTexture" 会在当时为每一的使用的obj抓取一次

    GrabPass { "TextureName" } 每个名字在 每帧,第一次使用时抓取一次
  • commandBuffer

    GrapPass在每帧至少捕获一次,优化思路是可以统一关闭,减少抓取次数

    基本思路是,独立一个只绘制扭曲层的相机,在OnPreRender中检查抓取cd,引用次数,扭曲开关等,

    用Graphics.ExecuteCommandBuffer(commandBuffer);的方式手动抓取

核心部分代码

private void Awake()
{
... ...
var cam = GetComponent<Camera>();
rt = RenderTexture.GetTemporary(cam.pixelWidth, cam.pixelHeight, 16, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Default, 1); commandBuffer = new CommandBuffer();
commandBuffer.name = "GrabScreenCommand";
commandBuffer.Blit(BuiltinRenderTextureType.CurrentActive, rt);
} void OnPreRender()
{
if (UseCount <= 0 || Time.time < nextGrapTime)
return; nextGrapTime = Time.time + grapCD;
Graphics.ExecuteCommandBuffer(commandBuffer);
}

扭曲效果

主要使用两个内置函数 https://www.jianshu.com/p/df878a386bec

  • float4 ComputeScreenPos(float4 pos)

    将摄像机的齐次坐标下的坐标转为齐次坐标系下的屏幕坐标值,其范围为[0, w]

    值用作tex2Dproj指令的参数值,tex2Dproj会在对纹理采样前除以w分量。

    当然你也可以自己除以w分量后进行采样,但是效率不如内置指令tex2Dproj

  • half4 tex2Dproj(sampler2D s, in half4 t) { return tex2D(s, t.xy / t.w); }

    扭曲使用贴图计算UV偏移

核心部分:

v2f vert (input v) {
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.texcoord;
o.uvgrab = ComputeGrabScreenPos(o.vertex);
return o;
} fixed4 frag (v2f i) : COLOR {
fixed2 norm = UnpackNormal(tex2D(_Distortion, i.texcoord)).rg;
i.uvgrab.xy -= _Strength * norm.rg * _RaceDropTex_TexelSize.xy;
fixed4 col = tex2Dproj(_RaceDropTex, i.uvgrab);
return col;
}

扭曲效果 效率优化 GrapPass,CommandBuffer对比的更多相关文章

  1. 见招拆招-PostgreSQL中文全文索引效率优化

    * { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans ...

  2. (转)热空气扭曲效果shader

    转自:http://blog.sina.com.cn/s/blog_89d90b7c0102vaqy.html 热空气扭曲在大自然中形成是比较复杂的,这里只是通过取屏幕纹理和移动UV来模拟热扭曲效果. ...

  3. Unity3d代码及效率优化总结

    1.PC平台的话保持场景中显示的顶点数少于200K~3M,移动设备的话少于10W,一切取决于你的目标GPU与CPU. 2.如果你用U3D自带的SHADER,在表现不差的情况下选择Mobile或Unli ...

  4. php效率优化

    php效率优化 最近在公司一边自学一边写PHP程序,由于公司对程序的运行效率要求很高,而自己又是个新手,一开始就注意程序的效率很重要,这里就结合网上的一些资料,总结下php程序效率优化的一些策略:1. ...

  5. Unity Shader-热空气扭曲效果

    GrabPass GrabPass是Unity为我们提供的一个很方便的功能,可以直接将当前屏幕内容渲染到一张贴图上,我们可以直接在shader中使用这张贴图而不用自己去实现渲染到贴图这样的一个过程,大 ...

  6. QRowTable表格控件(三)-效率优化之-合理使用QStandardItem

    目录 一.开心一刻 二.概述 三.效果展示 四.QStandardItem 1.QStandardItem是什么鬼 2.性能分析 3.QStandardItem使用上的坑 五.相关文章 原文链接:QR ...

  7. Kettle中ETL的效率优化

    ETL效率优化 开启数据库日志记录及性能监控 如果我们想要优化一个ETL(KTR或者KJB)的性能,我们首先需要知道的就是它的瓶颈在哪里.而这些信息一般只能在ETL运行的步骤度量中看到,并且是不会持久 ...

  8. 开发效率优化之Git分布式版本控制系统(一)

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680本篇文章将先从Git分布式版本控制系统来阐述开发效率优化 一,企业 ...

  9. java关于for循环的效率优化

    我们知道在实现一个功能的时候是可以使用不同的代码来实现的,那么相应的不同实现方法的性能肯定也是有差别的,所以我们在写一些对性能很敏感的模块的时候,对代码进行优化是很必要的,所以我们说一下for循环(w ...

随机推荐

  1. flex里InputText不能输入中文

    最近做项目都没做任何的更新,今天突然遇到在flex里的InputText无法进行中文输入,晚上查找了下资料,很多原因说是flashplayer的一个BUG. 在网上找到两种解决办法: 1.会出现这种情 ...

  2. Assigning to "id<CALayerDelegate> _Nullable" from incompatible type "ZXCapture *const __strong" 的警告提示信息

    该警告提示信息,是说,设置了代理对象,但是并没有继承它的代理.下图中,可以看出,警告信息提示我们没有继承“CALayerDelegate”的代理. 解决方法,很简单,(在 @interface 文件中 ...

  3. Codeforces 658B Bear and Displayed Friends【set】

    题目链接: http://codeforces.com/contest/658/problem/B 题意: 给定元素编号及亲密度,每次插入一个元素,并按亲密度从大到小排序.给定若干操作,回答每次询问的 ...

  4. Python 列表的复制操作

    2013-10-18 10:07:03|   import copy a = [1,2,3,['a','b']] b = a c = a[:] d = copy.copy(a) e = copy.de ...

  5. [Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)

    4832: [Lydsy2017年4月月赛]抵制克苏恩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 673  Solved: 261[Submit][ ...

  6. final finally finalize 区别及用法

    final 1,final修饰的class,代表不可以继承扩展. 2.final的方法也是不可以重写的. 3.final修饰的变量是不可以修改的.这里所谓的不可修改对于基本类型来来,的确是不可以修改. ...

  7. openstack DVR的AIO 问题

    问题描述 : 创建public 网络,创建路由器,并且把路由器的gateway 设置指向网络后有下面几种错误 路由器对应的linux network namespace 建立起来了,但是里面并没有对应 ...

  8. Binder IPC的权限控制

    PS:个人理解:当进程1通过Binder调用组件2时,会将进程1的pid及uid赋给组件2,并检测进程1的pid及uid是否有权限调用组件2.而后组件2需要调用组件3,此时组件2保存的pid及uid为 ...

  9. Tomcat和Jetty对WebSocket的支持

    公司项目须要,了解了下眼下几种支持WebSocket的框架.曾经用jWebSocket做过一些项目.相对来说.改jWebSocket的源代码略复杂,也不是一天两天能搞定的. 一调研才发现,如今非常多主 ...

  10. C语言的各种位运算符的操作简述

    运算符: 算术运算符: + , - , * , / , % , ++ , -- 符合运算符: += , *= , /= , %= 条件运算符:  ? : 关系运算符: == , >= , < ...