Post processing

Motion Blur / Motion Vectors

モーションブラー

移動方向へ像を流して速さを表す。

5 / 10

Interactive demo

Preparing the demo…

Motion Blur / Motion Vectors

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

動いている物やカメラを振ったときに、移動した方向へ像を流す表現です。現実のカメラは、シャッターが開いている間の像を 1 枚に重ねて記録するので、速く動く物はぶれて写ります。ゲームでは、各画素が前のフレームから画面上でどれだけ動いたか(モーションベクトル)を描き、その向きに沿って色を平均することで再現します。速さの感覚を伝え、低いフレームレートでも動きをなめらかに見せます。

ゲームでの使いどころ

  • スピード感:レースゲームの背景の流れ、高速で走るキャラクター、落下や突進。
  • カメラの動き:素早く振り向いたときの画面の流れ。
  • 攻撃の軌跡:剣や拳の動きを流して、打撃の勢いを強調する(オブジェクト単位のブラー)。
  • 30 fps のゲーム:フレームの間を補って、カクつきを目立たなくする。

しくみ

1. モーションベクトルを描く:各物体を描くとき、今のフレームの位置と、前のフレームの位置(前の物体の行列 × 前のカメラの行列)の両方を計算し、画面上の差を書き出します。

v=p今画面−p前画面\mathbf{v} = \mathbf{p}_{\text{今}}^{\text{画面}} - \mathbf{p}_{\text{前}}^{\text{画面}}

物体が動いた分とカメラが動いた分の両方が含まれます。このバッファは TAA の再投影にも使うので、現代のエンジンではほぼ必ず用意されています。

2. 動きの方向にぼかす:各画素で、モーションベクトルに沿って前後の色を数か所読み、平均します。

C=1N∑i=0N−1Cscene ⁣(uv+v⋅s(iN−1−12))C = \frac{1}{N}\sum_{i=0}^{N-1} C_{\text{scene}}\!\left(\mathbf{uv} + \mathbf{v}\cdot s\left(\tfrac{i}{N-1} - \tfrac{1}{2}\right)\right)

ss はシャッターの開いている割合で、映画でよく使われる「180° シャッター」はフレーム時間の半分(s=0.5s = 0.5)です。

実装のポイント

  • 前のフレームの行列を保存する:物体ごと、骨ごと(スキニング)に前のフレームの行列を保存しておく必要があります。
  • フレームレートに依存させない:実際のフレーム間隔が変わっても同じ見た目になるよう、ベクトルを基準のフレーム時間に換算します。
  • タイル化で輪郭を正しく:動く物の輪郭の外側(背景側)にもぶれがはみ出すべきなので、実際のゲームでは画面を小さなタイルに分けて、周囲の最大の速度を使う方法(McGuire の手法)を使います。

つまずきやすい点

  • 酔いやすさ:カメラの回転によるブラーは、プレイヤーによっては画面酔いの原因になります。オプションで無効にできるようにするのが一般的です。
  • UI や照準がぶれる:画面に固定された物(UI、一人称視点の武器)は、カメラと一緒に動くのでベクトルが 0 になるべきです。
  • 急なカット:カメラが瞬間移動したフレームで、巨大なベクトルが生まれて画面全体が流れます。カット時は前のフレームの行列をリセットします。

デモで試すこと

  1. 高速で回るドローンの光の輪が、回る方向へ流れています。「ドローンの速さ」を上げると、流れが長くなります。
  2. 「カメラを回す」をオンにすると、背景全体が回転方向に流れます。
  3. 「モーションベクトルを表示」で、各画素の画面上の動きを確認できます。動いている部分ほど明るく表示されます。
  4. 「シャッター」を 0 にするとぶれがなくなり、1 以上にすると長く流れます。

References

Unreal Engine Post Process Effects ↗

A general reference for this subcategory.