motion blur用于表现速度感.一种很常用的后处理技术
算法描述
- 根据深度图计算出每个像素的世界空间位置。
- 用前一帧的view-project矩阵进行变换,得到新的视口位置
- 根据当前帧与上一帧的视口位置,生成逐像素的速度值
- 沿着速度方向进行多重采样,结果进行平均
深度图提取物体位置
viewport position: $H = (\frac{x}{w}, \frac{y}{w}, \frac{z}{w} , 1)$
world-view-project matrix: M
$H \times M^{-1} = (\frac{X}{W}, \frac{Y}{W}, \frac{Z}{W}, W) = D$
world position: $WorldPos = \frac{D}{D.w}$
提取世界空间位置:
1 | float2 zOverW = tex2D(depthTexture, texCoord); |
逐像素计算速度
1 | float4 currentPos = H; |
实现emotion blur
沿着速度方向进行多重采样,并最终进行平均,得到最终的像素值
1 | float4 color = tex2D(sceneSampler, texCoord); |
动态物体
上面的算法考虑的是相机的运动,因此对于静态物体表现的很好
对于动态物体,需要记录物体在场景中的速度,可以单独生成一张速度图
可以通过当前帧与下一帧的view-projection矩阵变换物体,计算viewport的位置差异
屏蔽物体
如果想要屏蔽掉场景中的某些物体,以使motion blur不对其起作用
那么可以渲染一张mask纹理或者渲染到颜色图的alpha通道
Comments