GrabPass简介

所谓GrabPass,可以在渲染所在对象之前,获取当前FrameBuffer中的图像,以供在后续Pass中进行处理,有这它就可以实现一些只能通过屏幕后处理进行操作,比如高斯Blur等。下面两篇文章写的不错。

https://docs.unity3d.com/Manual/SL-GrabPass.html

https://zhuanlan.zhihu.com/p/29378964(里面内容比较不错)

首先,先介绍在Shader Forge中如何进行使用,ShaderForge中是可以支持直接使用的,其中SceneColor就是对应的GrabTexture

以下对应ShaderForge生成的代码:

            VertexOutput vert (VertexInput v) {VertexOutput o = (VertexOutput)0;o.pos = UnityObjectToClipPos( v.vertex );o.projPos = ComputeScreenPos (o.pos);COMPUTE_EYEDEPTH(o.projPos.z);return o;}float4 frag(VertexOutput i) : COLOR {float2 sceneUVs = (i.projPos.xy / i.projPos.w);float4 sceneColor = tex2D(_GrabTexture, sceneUVs);
// Lighting:
// Emissive:float3 emissive = tex2D( _GrabTexture, (sceneUVs * 2 - 1).rg).rgb;float3 finalColor = emissive;return fixed4(finalColor,1);}

其中可以看有两个Pass,其中一个是GrabPass,后面的代码可以通过_GrabTexture获取

GrabPass {}

另外,UnityAPI说明 中还可以使用以下的方式,但这种方式在Shader Forge中无法实现。

  • GrabPass { "TextureName" } grabs the current screen contents into a texture, but will only do that once per frame for the first object that uses the given texture name. The texture can be accessed in further passes by the given texture name. This is a more performant method when you have multiple objects using GrabPass in the scene.

其中我使用的Shader Forge1.38,如果使用默认的ScreenColor,计算出的屏幕UV是不对的

float3 emissive = tex2D( _GrabTexture, (sceneUVs * 2 - 1).rg).rgb;    //Shader Forge自动生成

half4 bgcolor = tex2Dproj(_GrabTexture, i.grabPos);     //使用官方做法

上行如果修改去掉*2-1操作就可以了

当然这里也可以通过,以下Scene UVs选项来解决这个问题,其值的范围是从0~1的

另外,Shader Forge中使用了Write Off也不是必要的

Tags { "Queue" = "Transparent" }

目前看有个限制,需要设置Quene为Transparent才能正常显示Grab到的内容。

相关特效实现参考以下

扭曲效果实现

需要注意的地方:

Normal Map选项一定选择,这样从法线空间获取颜色数值,这个选项与UnpackNormal是等价的

float3 _DistortMap_var = UnpackNormal(tex2D(_DistortMap,TRANSFORM_TEX(node_4942, _DistortMap)));

其核心是追加了一个扭曲的Offset

融合一些贴图之后,会更有科技感一些,主要是Texture使用Add的方式与之前的画面进行融合处理。

结合屏幕深度

使用不同的扭曲权重

以下读取屏幕深度的方法

先在Vertex Shader中获取屏幕坐标

o.projPos = ComputeScreenPos (o.vertex);

COMPUTE_EYEDEPTH(o.projPos.z);

在片段Shader中获取当前片段坐标的屏幕深度

float sceneZ = LinearEyeDepth (UNITY_SAMPLE_DEPTH(tex2Dproj(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos))));

但这种获取深度的做法就是当前面只能在最上层

一个综合的效果

Blur效果参考 点击打开链接

Shader GrabPass应用实例——实现扭曲效果相关推荐

  1. Unity Shader - GrabPass 实现武器热扭曲拖尾效果

    文章目录 先来看看效果 实现思路 Unity带的TrailRender组件 编写脚本实现 CSharp Shader 参数 注意性能 还可以优化 总结 Project 以前龙之谷喜欢选战士,帅气. 战 ...

  2. Shader Forge 入门学习(二) 实现发光、火焰燃烧、溶解、扭曲效果

    引言:本篇博客主要记录ShaderForge的常用案例,包括外发光.火焰燃烧.溶解.扭曲等效果.由于内容较多会分成几篇博客记录.如果您对Shader Forge的常用操作还不熟悉,请先看 Unity3 ...

  3. unity Shader Graph实现2D图片扭曲波纹效果

    先看效果,制作版本:unity2019.4.2 制作2D图片效果,不需要用到光照信息,所以创建ShaderGraph时选用Unlit Graph. 图片一般都会有透明通道,记得修改Unlit Mast ...

  4. Unity Shader - Curved World - 类似 地铁跑酷,动物森友会 的世界扭曲效果 - 球形透视

    文章目录 ShaderLab cginc 固定 Vector.forward 方向的球形透视 根据镜头任意视角方向的球形透视 添加开始弯曲透视的 z 距离偏移 CurveWorldControl.cs ...

  5. psql屏幕输出全部结果_CommandBuffer实现Distort屏幕扭曲效果

    现在的游戏中很多特效都喜欢用到扭曲效果,常见的实现方案都是在Shader中使用GrabPass,来获取屏幕的画面然后去做计算.关于获取屏幕画面的几种方案的性能分析可以参考我上篇文章. idleworm ...

  6. 扭曲效果 效率优化 GrapPass,CommandBuffer对比

    屏幕图像捕捉: Shader的GrabPass GrabPass可以很方便地捕获当前渲染时刻的FrameBuffer中的图像. 其原理就是从当前FrameBuffer中copy一份纹理,通过SetTe ...

  7. Unity Shader-热空气扭曲效果(多种实现方案,包括移动平台)

    原文地址:https://blog.csdn.net/puppet_master/article/details/70199330 简介 千等万等终于等到了<耻辱2>打折,本以为可以爽一发 ...

  8. unityShader热空气扭曲效果

    本文转载自http://blog.csdn.net/puppet_master/article/details/70199330?locationNum=2&fps=1 简介 千等万等终于等到 ...

  9. [UnityShader3]热扭曲效果

    参考链接:http://blog.sina.com.cn/s/blog_89d90b7c0102vaqy.html 1.首先回顾一下透明度混合的实现.在片段着色器输出源颜色后,经过Blend后与目标颜 ...

  10. Unity 特效扭曲效果(使用command buffer实现)

    了解command buffer CommandBuffer携带一系列的渲染命令,可以指定在相机渲染的某个点执行本身命令(包括特殊渲染,保存当前rendertexture等) CommandBuffe ...

最新文章

  1. linux下free命令详解
  2. Struts1.x的使用
  3. Build 2017 | 一文看懂微软 Build 2017 大会:让 AI 走向边缘
  4. 执行脚本出现bin/bash: bad interpreter: No such file or d
  5. Angular之双向数据绑定(上)
  6. mac下多个php版本快速切换的方法
  7. 阿呆做网站(1)--基本功能
  8. GaussDB数据dump实现完全同步
  9. python列表用法大全
  10. 浅谈内联元素inline
  11. 微服务架构与API网关
  12. iOS-工程多target下的Podfile配置
  13. wget 覆盖文件下载的技巧,绝对有效
  14. hdu5294(Tricks Device)题解
  15. Rust 调用标准C接口的自定义c/c++库,FFI详解
  16. Java Attach机制实现原理
  17. Bootstrap Table 表头和表格内容不对齐
  18. 为深度学习选择最好的GPU
  19. 海量日志处理系统 - ReLA
  20. 10040---微信与朋友圈后台架构

热门文章

  1. [Ansible系列⑦]ansible fact变量
  2. Linux Ansible自动化运维 set_fact 模块
  3. bootstrap组件——导航条
  4. HighCharts一个基于JavaScript的图表插件
  5. httpclient实现模拟登陆126邮箱
  6. 计算机的硬盘配额如何更改,磁盘配额怎么设置
  7. 孤独的根号三 (Missing NUMBER)
  8. 解决安装vmware以后,系统服务增多,系统变慢的问题。
  9. 坦克大战Netty网络联机版项目笔记
  10. 裸眼 3D 技术是什么原理?