Motion Blur

Motion Blur

  此篇介绍最简单的全局Motion Blur。算法是将当前帧与前一帧按某一比例混合。这是一个过程,例如有10帧,在第1帧中,只有第1帧原图,第2帧中有1、2帧原图,第3帧中会有1、2、3帧原图,依次类推。

  

  假设混合比较为a,即原图为1-a,累积图为a,那么1帧新进入的图,在下一帧中,所占的比例就只有a,再下一帧就只有a^2,再下一帧就只有a^3,依次类推,第N帧后,比例会接近于0。a越小,消失的会越快,也就意味着MotionBlur效果越弱。相反,a越大,MotionBlur效果越强。通过将此混合参数叫做BlurAmount。为了防止完全抛弃新进帧的情况,通常会限制BlurAmount不大于0.92。

  

  最后,MotionBlur的Shader需要特殊处理一下。首先需要将原始帧与累积帧混合在一起。但普通的混合会连带alpha一起混合,而我们想做做的只是混合RGB,希望alpha保留。所以需要2个Pass,第一个Pass根据BlurAmount混合RGB,第二个Pass直接写入新的alpha。完整Shader如下:

  1 Shader "Hidden/MotionBlur" {
  2 Properties {
  3     _MainTex ("Base (RGB)", 2D) = "white" {}
  4     _AccumOrig("AccumOrig", Float) = 0.65
  5 }
  6
  7     SubShader {
  8         ZTest Always Cull Off ZWrite Off
  9         Fog { Mode off }
 10         Pass {
 11             Blend SrcAlpha OneMinusSrcAlpha
 12             ColorMask RGB
 13             BindChannels {
 14                 Bind "vertex", vertex
 15                 Bind "texcoord", texcoord
 16             }
 17
 18             CGPROGRAM
 19             #pragma vertex vert
 20             #pragma fragment frag
 21             #pragma fragmentoption ARB_precision_hint_fastest
 22
 23             #include "UnityCG.cginc"
 24
 25             struct appdata_t {
 26                 float4 vertex : POSITION;
 27                 float2 texcoord : TEXCOORD;
 28             };
 29
 30             struct v2f {
 31                 float4 vertex : POSITION;
 32                 float2 texcoord : TEXCOORD;
 33             };
 34
 35             float4 _MainTex_ST;
 36             float _AccumOrig;
 37
 38             v2f vert (appdata_t v)
 39             {
 40                 v2f o;
 41                 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
 42                 o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
 43                 return o;
 44             }
 45
 46             sampler2D _MainTex;
 47
 48             half4 frag (v2f i) : COLOR
 49             {
 50                 return half4(tex2D(_MainTex, i.texcoord).rgb, _AccumOrig );
 51             }
 52             ENDCG
 53         }
 54
 55         Pass {
 56             Blend One Zero
 57             ColorMask A
 58
 59             BindChannels {
 60                 Bind "vertex", vertex
 61                 Bind "texcoord", texcoord
 62             }
 63
 64             CGPROGRAM
 65             #pragma vertex vert
 66             #pragma fragment frag
 67             #pragma fragmentoption ARB_precision_hint_fastest
 68
 69             #include "UnityCG.cginc"
 70
 71             struct appdata_t {
 72                 float4 vertex : POSITION;
 73                 float2 texcoord : TEXCOORD;
 74             };
 75
 76             struct v2f {
 77                 float4 vertex : POSITION;
 78                 float2 texcoord : TEXCOORD;
 79             };
 80
 81             float4 _MainTex_ST;
 82
 83             v2f vert (appdata_t v)
 84             {
 85                 v2f o;
 86                 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
 87                 o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
 88                 return o;
 89             }
 90
 91             sampler2D _MainTex;
 92
 93             half4 frag (v2f i) : COLOR
 94             {
 95                 return tex2D(_MainTex, i.texcoord);
 96             }
 97             ENDCG
 98         }
 99
100     }
101
102 SubShader {
103     ZTest Always Cull Off ZWrite Off
104     Fog { Mode off }
105     Pass {
106         Blend SrcAlpha OneMinusSrcAlpha
107         ColorMask RGB
108         SetTexture [_MainTex] {
109             ConstantColor (0,0,0,[_AccumOrig])
110             Combine texture, constant
111         }
112     }
113     Pass {
114         Blend One Zero
115         ColorMask A
116         SetTexture [_MainTex] {
117             Combine texture
118         }
119     }
120 }
121
122 Fallback off
123
124 }

  

  

时间: 2024-08-07 16:58:16

Motion Blur的相关文章

【翻译】Motion Blur for mobile devices in Unity

原文链接:https://tech.spaceapegames.com/2018/09/06/motion-blur-for-mobile-devices-in-unity/ 什么是运动模糊?-What is Motion Blur? 维基百科将运动模糊定义为: 运动模糊是在照片或序列帧中移动物体的明显拖尾,例如电影或动画.由于快速移动或长时间曝光,在记录单次曝光期间记录的图像发生变化时,会出现这种情况. 当我们使用相机拍摄图像时,快门打开,传感器捕获图像,然后快门再次关闭.快门打开的时间越长,

Image Blur

Blur 是一种常见的效果,在 Adobe 软件 After Effect 中可以找到以下几种: 类型 解释 Box Blur A box blur, (also known as a box linear filter) is a spatial domainlinear filter in which each pixel in the resulting image has a value equal to the average value of its neighboring pixe

计算机图形学研究领域分哪些

计算机图形学各个领域的目标或许不同,但最终的形式都是渲染(即绘制)在二维的显示设备上的图像.下面是一个简单(可能并不完全)的分类: ?计算机图形学-领域及分支: ?1 绘制1.1 真实感绘制(非实时)1.1.1 光线追踪(Ray-tracing)1.1.2 全局光照(Global Illumination)......1.2 实时绘制1.2.1 Shading(BRDF, Programmable Shading等)1.2.2 纹理(Texture Synthesis, 反走样, 采样等)1.2

Unity3D中的Post effects

提要 所谓post effects,就是后处理,在渲染的流水线中属于最后的阶段,处理的对象是由场景生成的一张图片.常见的后处理效果有HDR,Motion Blur等,通过对屏幕空间的后处理,可以很方便的调整游戏整体的风格.下面是要用到的场景. Unity的ShaderLab内建变量 为了编程方便,Shaderlab中内建了一些变量,可以在Shader中直接引用. 这里要用到的 _SinTime - 时间的的正弦函数. 更多的内置变量可以参考这里 ShaderLab built-in values

PhotoShop算法实现进阶-模糊滤镜-运动模糊(二十四)

[email protected] http://blog.csdn.net/kezunhai 造成图像退化或者说使图像模糊的原因有很多种,如果是因为在摄像时相机和被摄景物之间有相对运动而造成的图像模糊则称为运动模糊.所得到图像中的景物往往会模糊不清,我们称之为运动模糊图像.运动模糊(Motion Blur)是一种抓取物体运动状态效果的滤镜,主要应用物体运动时曝光的摄影手法,模拟出在摄像中拍摄运动物体的间接曝光功能,从而使图像产生出一种动态效果.它通常用来制造物体掠过或移动的效果. 实现原理:运

使用Unity Render Textures实现画面特效——建立画面特效脚本系统

本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源(当然你也可以从官网下载). ========================================== 分割线 ========================================== 写在前面 最近由于成为研一新生,被入学的各种事情耽误,好久没有更新博客,好惭愧...刚收拾好我就来更

计算机图形学名词解释

转自 http://blog.csdn.net/lwfcgz/article/details/39254743 3D三维(three dimension).客观世界中静止的物体都是三维的,在计算机图形学中常在一定的坐标系中用(x,y,z)坐标系列表示物体. 3D modeling3D建模.用三维坐标来描述物体的形状.在各种计算机图形应用领域中有不同的三维建模方法,用不同的算法来描述这些领域中的物体和对象. 3D transformation3D变换.在三维空间中把物体的三维坐标从一个位置变换至另

Awesome Deep Vision

Awesome Deep Vision  A curated list of deep learning resources for computer vision, inspired by awesome-php and awesome-computer-vision. Maintainers - Jiwon Kim, Heesoo Myeong, Myungsub Choi, Jung Kwon Lee, Taeksoo Kim We are looking for a maintainer

【译】What is Away3D

做了几个基于Flash平台的3D的项目,一路走来收获颇多.Away3D作为一个开源的Flash3D引擎,在3D页游领域,无疑是当前OGRE在国内的地位. 翻译出了多年前做Away3D中国社区的时候翻译的一篇文章,以此记录这段难忘的经历! 什么是Away3D?(What is Away3D?) Away3D是一个开源的,基于Flash平台的实时3D引擎.这个项目最初是由Alexander Zadorozhny和 Rob Bateman 在2007年开始的.没想到这一发就不可收拾.下面是一些Away