UDN
Search public documentation:

MotionBlurJP
English Translation
中国翻译
한국어

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 ホーム > ポストプロセス エフェクト > ポストプロセス機能 モーション ブラー


ポストプロセス機能 モーション ブラー


左 : モーション ブラーが無効
右 : モーション ブラーが有効 (カメラの素早い動きを伴って)

概要


モーション ブラーは静止画像と動画で見られるエフェクトです。カメラにおいては、シャッターが短時間開いていることによってフィルムに光が当たります。そのため、速く動く物体はブラーされて見えます。モーション ブラーは人間の目にも知覚されます。これは、人間の目の中にあるセンサーが、一定時間に渡って反応するためです (像が時間をかけて消えていくからです)。モーション ブラーは、大抵フレームレートが 20 ~ 30 の動画やスクリーンショットにおいて見られます。

我々が実装したモーション ブラー ポストプロセスは、 カメラ モーション ブラーオブジェクト モーション ブラー を表現することができます。オブジェクトのモーションについては、スクリーン ピクセルそれぞれにつき 1 個の 2D 速度ベクターを生成します。この情報は毎フレーム更新され、中間的な速度テクスチャに保存されます。この情報はこの後に続く解像度半減ポストプロセスによって使用され、それによって、解像度が半分になったモーション ブラー画像が生成されます。この画像は最高の解像度のシーン画像とブレンドされることによって、必要な部分の解像度を高く保つことができます。モーション ブラーされた画像を生成するには、少数のテクスチャ ルックアップを平均化させています。複数の画像が表示される (例 : 5 個のテクスチャ ルックアップを平均化すると 5 個のゴースト画像が現れる可能性があります) ことを回避するために、最大スクリーン速度を設けます。モーション ブラーを半分の解像度で実行すれば、パフォーマンス上有益であるばかりではなく、ごく少数のテクスチャ ルックアップを使用して非表示にすることもできます。

技術関連トピックの詳細については、 モーション ブラーのスキニング MotionBlurSoftEdge を参照してください。

実装


2 種類のモーション ブラーは適切に追加されているため、動きを調整した際はエフェクトも低減します。例えば、移動しているオブジェクトをカメラが追跡する場合などはこれに該当します。このメソッドは、用意されているシーン画像データを使用した場合にのみ機能するため、エフェクトをすべて低減できるとは限りません。通常、モーション ブラーは非常に細微なエフェクトであるため、近似値を使うだけで十分な結果が得られることが多い。

パフォーマンスを向上させるため、モーション ブラーの画像は、プリパスから uber ポスト プロセスのパスにおいて半分の解像度で生成されます。またこれは、結果の画像をアップスケールする必要があること、およびモーション ブラー以外の画像を必要に応じてマスク(ごくわずかの画像移動)する必要があること意味します。

motionmblurtransiation.jpg
前方に進んでいるプレイヤーは、およそ画像のコーナーあたりでモーション ブラーを知覚します。
最高解像度の画像が半分の解像度のモーション ブラー画像とソフトにブレンドされていることが分かります。

デバッグでは、「visualizetexture」コマンドでブレンド マスクに注目します。高解像度が使用されている部分のアルファ チャンネルは白、半解像度バッファのブラー コンテントが使用されている部分は黒くなっています。

motionblurmask.jpg

なお、プレーヤーの視点を回転させると、モーション ブラーが発生します。これは正常な状態ですが、プレーヤーによっては不要に感じることもあります。視点は通常、画像内の特定ポイントに焦点を当ててそれを追います。 このため、視界にはモーション ブラーが発生しないことになります。これをシミュレートするには、視点を適切に追跡するか、あるいは、目の動きをシミュレート(多くの場合は成功しない)する必要があります。対策:モーション ブラーを少なくする。モーション ブラーをマスクして画面の外周エリアのみに効果を反映させる。重要なプレイ場面ではモーション ブラーを制限する。フレーム レートを上げる。

camera motion blur (カメラのモーション ブラー) に関しては、前のビュー マトリクス、現在のビュー マトリクス、およびピクセル深度から、状況に応じて 2D モーション ベクターを計算することができます。 object motion blur (オブジェクトのモーション ブラー) に関しては、すべてのモーション ブラー オブジェクト (小さいオブジェクトやゆっくり移動するオブジェクトは、パフォーマンス上の理由から除外される) のジオメトリを「ベロシティ テクスチャ」と呼ばれるテクスチャにレンダリングすることにより、ピクセル単位でベクターを計算することをお勧めします。このテクスチャのデータは、コンソールの VisualizeTexture コマンドを使用して確認できます。

perobjectmotionblur.jpg
左 : ゲームにある回転する羽根です。
右 : 同じシーンを VisualizeTexture コンソールコマンドを使用して表示しています。

ベロシティ テクスチャの色は、モーション ベクターの方向と強度を表しています。以下の画像は、赤と緑のチャンネルが、モーション ベクターの定義にどのように使用されているかを表したものです (円は最大ベロシティ)。

colormeaning.jpg
ベロシティ テクスチャの色は、オブジェクトのモーションを示しています。
黒は、カメラ / オブジェクト モーションなし のために残しています。
青とアルファ チャンネルは、放射ブラー機能に使用できます。

剛体 については、平行移動、回転、スケーリングなど、すべての行列変換に対応しています。その後、ボーン アニメーション のサポートを追加しました。この方法は、特別なハードウェア上の機能を必要とするとともにパフォーマンスに影響を及ぼすため、デフォルトでは有効になっていません。これ以上の情報については、 モーション ブラーのスキニング をご覧ください。

PerBoneMotionBlur.jpg
モーション ブラー スキニングによって、体の各部を異なる方向に動かすことができます。

方向性ブラー


理想的には、画像コンテントを動きの方向に応じてピクセルに配分できるようにします。しかしネイティブでこれを導入すると、非常に処理が遅くなります。現時点では、バイリニア フィルタリングされた複数のテクスチャ参照をベースとした収集処理によって、これに近い効果を実現しています。シーン テクスチャの半解像度バージョンを使用している限りは、パフォーマンスも良く、スムーズな動きさえも実現しています。極端な動きにおいては、ベクターは非常に大きくなります。複数の画像を使用した際の影響を避けるため、動きを 2D ディスクに固定することもできます (Max Velocity (最大ベロシティ) を参照)。

入力が HDR 画像であるとともに、モーション ブラー後にトーンマッピングを実施するため、明るい画像コンテンツがはっきりとした線を形成するのが分かります。このエフェクトは、現実のカメラでも見られるため、望ましいものです。

HDRMotionBlur.jpg
明るいオブジェクト (HDR コンテンツ) がモーション ブラーのおかげでより明るく表示されています。

収集処理は高速で、画像コンテンツが動く方向に応じたブラーを発生させることができますが、これ以上の工夫がない限りは、動くオブジェクトの前にある静的な領域に画像コンテンツがリークしてしまいます。このような問題を修正するには、これらのケースをマスクアウトするとともに、ブラーが生じる領域を、動いているオブジェクトの範囲内に限定します。しかし、これだけではまだ正しく表示されません。と言うのも、オブジェクトはその内部でブラーするものの、コンテンツの外側ではブラーしないからです。これを解決するには、 MotionBlurSoftEdge 機能を使用します。

MotionBlurSoftEdgeNumbers2.jpg
SoftEdge 機能を使用することによってモーション ブラーが、動いているオブジェクトの外でも表示されるようになります。

モーション ブラー エフェクトは、放射状のブラーと組み合わされます (メソッド ズームを使用した場合は Photoshop の放射状のぼかしと同様になる)。両方のエフェクトには多数の共通点があるため、効率上の理由でメソッドが統合されました。両方のメソッドには共通のモーション ベクターが 1 つあり、両方のエフェクトを多用した場合は処理落ちが発生します。しかし、これが発生することはほとんどありません。

RadialBlur.jpg

パラメータの調節


ポスト プロセス チェーンでは、uber ポスト プロセス ノードで以下のプロパティを設定できます。モーション ブラー ノードを使用する必要はありませんが、モーション ブラー用に uber ポスト プロセス ノードが必要になり、同じ設定を適用する必要があります。

editorsettings.jpg

Max Velocity (最大ベロシティ) では、サイズを指定してディスクでの動きを制限できます (画面幅に応じてサイズ調節され、縦サイズに関係なく常に円状になる)。この数値は、適切なサイズの特定の内部定数に対する乗数となっています。1 未満に設定するとベクターがさらに制限され、1 を越えた数値にするとブラーが増加しますが、同じサンプル カウントを維持すると結果に悪影響が出ます (複数の画像)。

motionclamp.jpg

Motion Blur Amount (モーション ブラーの量) では、モーション ブラー ベクターを拡大縮小できます。この数値を最初に調節し、Max Velocity (最大ベロシティ) を高い数値に固定することをお勧めします。このように設定しない場合は、スケール (拡大縮小) の変化を確認できません。最終的には、非常に小さい半径に対して、高い数値を設定することになる場合も考えられます。これにより、ごくわずかな動きでもブラーが発生し、モーション ブラーなしの場合より、全体的な効果が悪化する可能性もあります。

motionscale.jpg

Full Motion Blur (完全モーション ブラー) チェックボックスでは、カメラのモーション ブラーを無効にすることができます。その場合も、オブジェクトのモーション ブラーは有効のまま維持されます。

Camera Rotation Threshold (カメラ回転閾値) カメラのモーション ブラーが無効になるまでにカメラが回転できる最大角度を設定します (カメラカットに便利です)。

Camera Translation Threshold (カメラ移動閾値) カメラのモーション ブラーが無効になるまでにカメラが移動できる最大距離を設定します (これもカメラカットに便利です)。

チェーンでの設定は、ポスト プロセス ボリュームによって上書きすることができます。

アクタには、 Motion Blur Scale (モーション ブラー スケール) があります。カメラとともに動くオブジェクト (例: プラットフォーム) 上のモーション ブラーを無効にするには、その値がかつては必要でした。しかし、これはもう必要がなくなりました。モーション ブラーが、このような関連づけられた動きを正しく処理できるようになったからです。新たな実装が実現した場合に、この値は除去されるか非アクティブ化されることになります。

モーション ブラーとのインタラクション


現実の世界では、ブルームが見られるのは大量の光が同一の方向 (スクリーン上の位置) からやってくる場合です。モーション ブラーは、明るい領域の範囲をより広いスクリーン領域に拡散させます。最近の変更 (2010年10月28日) によって、このエフェクトがシミュレートされました。

BloomAfterMotionBlur.jpg
新たなメソッドを使用した場合、ブルームがよりぼんやりと表示され、動いているオブジェクトのパス上により大きく広がっていることに注目してください。

このエフェクトが見えるのは次の場合です。すなわち、オブジェクトが素早い動きをするか、カメラの動きが速い場合で、なおかつ、正しく設定 (大きな最大ベロシティ、大きなモーション ブラー量、ブルーム閾値対オブジェクトの輝度 MotionBlurSoftEdge ) されている場合です。こうすることによって、以前はブルームしていた明るいコンテンツは、より大きく広がります。また、モーション ブラーをもっと目立たなくさせることもできます。

既知の制約と問題


  • Matinee で行われるようなカメラカットが、モーション ブラーについて問題を起こします。現在のところ、カメラが大きく回転したり移動したりする時にモーション ブラーが無効にするという方法に頼っています。これらの値の閾値は、両方とも、カスタマイズすることができます。理想的には、Matinee がイベントを発生させることによって、ユーザーエラーの原因を 1 つ減らせれば良いのですが、このような修正が行われても、まだ他に問題は残るでしょう (例: ゲームコード)。一番良いのは、常にカメラを動かし、ジャンプスイッチやカメラスイッチをいろいろと操作することでしょう。これを実装するのはもっと難しいのです。と言うのも、カメラオブジェクトはフレーム毎に (ビュー単位で) 再作成されているからです。
  • 最大ベロシティが非常に大きいと、イメージが複数表示されます。(ピクセル単位のランダム化を試みましたが、結果は思わしくありませんでした。パフォーマンスを犠牲にしてサンプルの数を増やすと良い結果を得られるので、われわれは今後このためのオプションを追加する可能性があります。)
  • モーションブラーが、低解像度でのシーン入力に基づいており、uber ポストプロセス パスにおいてアップ サンプリングされつつある低解像度のテクスチャにレンダリングされます。これは可視化できます。マスクの調整が有効になることもあります (未公開)。
  • より快適な編集のために、エディタの中ではモーション ブラーを無効にしています。このことは、放射ブラーにも影響します。

便利なコンソール コマンド


show postprocess
ポストプロセスをすべて同時に有効または無効にします。
visualizetexture
中間バッファを調べます。(例: 低解像度モーション ブラー入力、ベロシティ テクスチャ、モーション ブラー出力)
MotionBlurMaxVelocity (モーション ブラー 最大ベロシティ)
ポストプロセスの設定項目をオーバーライドします。(調整およびデバッグのため)
MotionBlurAmount (モーション ブラー量)
ポストプロセスの設定項目をオーバーライドします。(調整およびデバッグのため)
MotionBlurSoftEdge (モーション ブラー SoftEdge)
MotionBlurSoftEdge を参照してください。
MotionBlurSkinning (モーション ブラー スキニング)
モーション ブラーのスキニング を参照してください。
set skeletalmeshcomponent bforcerefpose 1
アニメートされたオブジェクトのためのスキニングを無効にします。
slomo 0.1
ワールドのシミュレーション速度を落とします。(デフォルト値は「1」)