使用速度映射图:速度映射图中存储了每个像素的速度,然后使用这个速度决定模糊的大小和方向
速度缓冲的生成有多种方法:
一种方法是把场景中所有物体的速度渲染到一张纹理中,但这种方法的缺点在于需要修改场景中所有的物体的Shader代码,使其添加计算速度的代码并输出到一个渲染纹理中
《GPU Gems3》第27章中介绍了一种生成速度映射图的方法,这种方法利用深度纹理在片元着色器中为每个像素计算其在世界空间下的位置,这是通过使用当前的视角*投影矩阵的逆矩阵对NDC下的顶点坐标进行变换得到的,当得到世界空间下的顶点坐标后,使用前一帧的视角*投影矩阵对其进行变换,得到该位置在前一帧的NDC坐标,然后计算前一帧和当前的位置差,生成该像素的速度。这种方法的优点是可以在一个屏幕后处理步骤完成整个效果的模拟,但缺点是需要在片元着色器中进行矩阵纹理操作,对其性能有影响
本节实现的运动迷糊使用于场景静止,摄像机快速运动的情况
这是因为我们在计算时只考虑了摄像机的运动,因此,如果把代码应用到一个物体快速运动而摄像机静止的场景,就会发现不会产生任何运动模糊效果,
如果想要对快速移动的物体产生运动模糊的效果,就需要生成更加精确的速度映射贴图(可以在Unity自带的ImageEffect包中找到更多的运动模糊的实现方法)
//13.2 再谈运动模糊
Shader "Unlit/Chapter13-MotionBlurWithDepthTexture"
{
Properties{
_MainTex("Base (RGB)", 2D) = "white" {}
_BlurSize("Blur Size", Float) = 1.0
}
SubShader{
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex;//输入的渲染纹理,UNITY传递的
half4 _MainTex_TexelSize;
sampler2D _CameraDepthTexture;/