使用速度映射图:速度映射图中存储了每个像素的速度,然后使用这个速度决定模糊的大小和方向
速度缓冲的生成有多种方法:
一种方法是把场景中所有物体的速度渲染到一张纹理中,但这种方法的缺点在于需要修改场景中所有的物体的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 "

本文探讨了运动模糊的实现,特别是通过速度映射图来确定模糊的大小和方向。介绍了两种生成速度缓冲的方法,包括修改物体Shader代码和利用深度纹理计算世界空间位置。重点讲解了《GPU Gems3》中提到的方法,虽然性能上可能受影响,但能在一个屏幕后处理步骤完成。本教程适用于摄像机快速运动的场景,对于物体快速运动的情况,需要更精确的速度映射贴图。
最低0.47元/天 解锁文章
657

被折叠的 条评论
为什么被折叠?



