动态模糊近几年广泛应用于游戏制作的一种特效,可以使得游戏所呈现出的运动画面更接近于真实相机所拍摄出的效果。
在真实世界中,运动模糊是指在相机拍摄画面时,由于被拍摄物体在相机快门曝光的短暂时间内有一定幅度的运动,造成拍摄出的画面产生残影和模糊的效果,通常相机只有在捕捉高速运动物体或者相机本身处在高速旋转中会出现这种效果。
那么如何能利用GPU在游戏画面中实现这一效果的呢?
其实原理和实现都非常的简单,实现Motion blur的方法也有很多,这里以DirectX9自带Sample中的方法为例进行说明。
我们知道在游戏中对于画面的渲染是一种单帧渲染,通常情况下,两帧之间并没有直接关联,但是对于动态模糊在时间上是一个连续行为,最终的效果势必需要前后状态的参与。
所以实现的基本原理就是通过记录图像中每一个像素点的运动速度向量,并在该方向采样来混合绘制颜色。
……………………
就这么简单……
不过实现的时候还是有很多地方需要注意的,首先效果的实现用到了Post-Processing的概念,也就是说效果的生成并非是在每帧绘制过程中实现的,而是在当前帧绘制完成后进行的,不同的环境中可以用不同的方法完成,在DX下是通过前一文中的Render Target来实现的。
在Sample中记录每一像素点的速度是通过下一文中介绍的Multiple Render Target实现的,格式使用的是D3DFMT_A8R8G8B8和D3DFMT_G16R16F浮点型。
像素点速度的计算是通过相邻两帧之间像素的经过投影变换的世界矩阵相减得到的,不要忘记的是,坐标要除以w得到非齐次坐标后再进行相减计算。
得到像素点速度后,通过在速度方向上进行一定数量的采样,混合后即可得到该点的正确颜色。
这种方法的实现优点在于原理简单,缺点在于对于模拟极端情况下(超长曝光时间,超高运动速度)和运动轨迹弧度较大是失真比较明显。