元記事:
blender.org -- Vector Blur
ベクターブラー(Vector Blur)
by Ton Roosendaal
レンダーパイプライン再構築の結果の一つとして、ポストプロセスのエフェクトであるモーションブラー用に、モーションベクトルを元に、ピクセルの計算やレンダリング、格納、処理ができるようになりました。
ベクターブラーを作成する最も判りやすいアプローチは、それぞれのピクセルに、方向のある形状のフィルタカーネルを新しい画像に蓄積することです。当初のこの方法によるテストでは、あまり満足のいく結果が得られない事が証明されました。そのため、私は頭にあった別の物を実装しました。これは、私が知っている限りでは全く新しい、もしくはまだ論文になっていない物だと思います。
サンプル
エレファンツドリームより
新しいアプローチ
簡単にいうと、画像全体のすべてのピクセルを、ピクセル毎の深度情報も含め四角形ポリゴンによる3Dモデルへと変換します。その後、これらのポリゴン内の頂点毎に、スピードベクトルを増加的に適用することにより、非常に効果的にモーションを再構築できます。ステップ数X回のレンダリングと累積により、画像をモーションブラーのようにきっちり構築できます。
アニメーションしている3Dシーン
| |
そのレンダリングされた画像
| |
Z 深度情報
|
ピクセル毎に四角ポリゴンで作成された3Dシーン。それぞれのポリゴンはそのZ深度にそった位置にあります。
| |
それぞれの四角形はそのスピードベクトルにそって移動、累積されます。
| |
ベクターブラーの最終結果
|
下記に、Blender のベクターブラーによって生じるステップの詳細を説明します。
プリプロセス(前処理)レンダリングジオメトリが作成される前に、プリプロセスで、前フレームから次フレームへのスピードベクトルと、すべての Vertex が計算されます。スピードベクトルはスクリーンに平行で、ピクセル数で表現されています。結果は4つの浮動少数点数値で、以前の位置の(X,Y)と、次の位置の(X,Y)です。
これらの値がスクリーン上の投射を元にしているので、大きい(可視の)Face がその Camera の前半分と後半分に存在するのをふせぐため、比較的小さい Face を使用することが重要です。
(注:このプリプロセスを行うため、RenderLayer の "Vec" Pass を ON にする必要があります)
レンダリングVertex Normal が Face 内で補間される量を決定するのと似た方法で、スピードベクトルがピクセルサンプル毎に計算され、ベクトルパスバッファ内に累積されます。
このバッファは最大スピードで初期化され、元の値より低いスピードの値でのみフィル可能になっており、ピクセルが速すぎるスピードの所為でアンチエリアスされるのを防ぎます。
半透明(Ztransp) の Face は、Blender 内部では別にレンダリングされ、スピードベクトルが生成された時に、異なった扱いをされます。ここでは Alpha 値も同様に考慮され、ある半透明の Face の Alpha 値が指定された閾値(現在は0.95)より大きい場合、スピードをそのバッファにコピーし、そうでなければ最小スピードで埋めます。
Compositorレンダリング後、"Vector Blur" ノードを Compositor に追加し、RenderResult の Z と Vec(Speed)Pass Output をこのノードにリンクしなければなりません。その後、Compositor はベクターブラー機能を呼び出します。
3Dモデルへの変換その後、画像のすべてのピクセルが四角形ポリゴンへ変換されます。この四角形の Vertex にはそのピクセルの Z の平均と、(Face の 4すみの)スピードベクトルの平均を、「最小非ゼロ」スピードルールで格納します。
この最小スピードルールは隣接しているピクセルの複数の Face が違う方向に動いているときに「ティアリング」でバラバラになるのを防ぐのに非常に上手く作用し、さらに動かないピクセルから動くピクセルが綺麗に離れていくようになります。
この段階は、画像の端のスピードベクトルを、すべての端の Vertex の X もしくは Y スピード成分を0にすることで補正して終わります。
マスキングこれは最も重要な段階です。それは、動かない部分を動く部分から分離する必要があるからです。背景をぼかさない状態のままにしなければならないという理由だけでなく、私たちは与えたモーションの「軌跡」から、背景のアンチエリアスされたピクセルの排除もしたいからです。
これは「タグバッファ」を使用することで行われ、ここで四角形に動くか動かないかのタグがつけられます。ユーザはまた、Vector Blur ノードの MinSpeed の閾値を手動で設定することもでき、カメラの移動などをうまく処理するのに使用できます。
この時のこのタグバッファは、実際の「マスク」であり、動く物(白)と、動かない物(黒)の白黒画像のようなものになります。
このタグバッファはその後、過去にビットマップのアンチエリアスに使用していた方法(まだコード内にあります。imbuf の antialias.c をチェックしてみて下さい!)を元にした、Alpha値を四角形に適用するアンチエリアスルーチンを通ります。その結果、私たちはマスクを良質のアンチエリアスと共に適用できるのです。
累積累積処理は、「サンプル」ステップ数分、スピードベクトルと増加する要素との乗算を実行します。サンプル毎に、過去と未来のベクトルの両方を累積していきます。
各サンプル毎に、下記の処理が行われます。
- タグバッファを、コピーされた移動しないピクセルのZ値でZバッファを初期化するのに使用されます(このため、移動部分をこの後ろに移動できます)。
- 一時的な描画バッファが作成・クリアされます。
- Z値で見えない部分を効果的にマスクし、タグバッファをこの一時バッファのすべての四角形を描画するのに使用します。
- その後、サンプルステップ(ウェイト値の減算)と、四角形の Alpha (タグバッファのアンチエリアス)を元に、この一時バッファがオリジナル画像の上に累積されます。
ベクターブラーの使用
1) RenderLayer に "Z" Pass が設定され、"Vec" が適用されていることを確認。
2) Compositor(
このページを参照)に、VectorBlur ノードを追加し、Image、Z、Vector ソケットをつなぐ。
3) VectorBlur の Output ソケットが Composite ノードにつながっていることを確認。
4) レンダリング!
ボタン- Samples: ベクターブラーで使用されるステップ数。ステップ数を多くすると、よりぼけた結果が得られます。
- MinSpeed: (フレーム毎のピクセル数で表現)これを小さい値に設定することで強制的に、非移動部分から移動部分を分離し、効率的な「マスキング」を行います。特にカメラの移動や、背景がゆっくり移動しているような場合に便利です。また、ブラーを行う画像の一貫性を確実に保つため、すべてのモーションベクトルをこの値で減らします。
- MaxSpeed: ブラーの最大ピクセル長で、極端に速く動く Object がうまくぼけるようにします。0で最大数はなしです。
- BlurFac: 「シャッタースピード」をコントロールします。実際にはスピードベクトルの大きさ要素として働きます。
Tips- ベクターブラーは(投影された)スクリーン座標を使用しているため、ある平面の半分がカメラの後ろにあり、もう半分が前にあるとき、そのベクトルはおかしくなります。巨大な平面(床や天井など)は少し分割してやる必要があることを覚えておいて下さい。
- 最良のベクターブラーを得るには、速く動く部分を静止(もしくはゆっくり移動している)部分から分離しましょう。そして、二つの RenderLayer を使用し、それらに別々にベクターブラーをかけます。
テストファイル(235KB)(Driven Hand .blend。Robert Ives氏作)
Last update: Jul 14 2006.
This section is maintained by Ton Roosendaal.
元記事:
blender.org -- Vector Blur