Q100418: 3D モーション ブラーの ScanlineRender の代替として VectorBlur を使用することにより、モーション ブラーのレンダリング時間を改善します

まとめ

Nukeで 3D オブジェクトのモーション ブラーを増やす標準的な方法は、ScanlineRender ノード内のサンプルを増やすことです。これらのサンプル値は、フレーム間の計算に使用される補間データの量を制御します。したがって、サンプル値が大きいほど、モーション ブラーがより詳細になります。

これらのサンプル値を増やすと、画像処理時間が大幅に増加し、より複雑なプロジェクトのパフォーマンスに影響を与える可能性があります。

この処理のオーバーヘッドを回避するには、別の方法として、ScanlineRender ノード自体の外部でこの計算を処理できます。これは、VectorBlur ノード内で ScanlineRender ノードの生成されたモーション ベクトルを使用することで実現できます。

この記事では、VectorBlur ノード (VectorBlur2 反復) を使用してワークフローを作成する方法を説明し、サンプル シナリオも示します。

詳しくは

ScanlineRender ノードはデフォルトで、 Nukeの 3D オブジェクトからモーション ベクトル パスを生成します。モーション ベクトル パス自体は、レイヤーの赤と緑のチャネル内に位置情報を数値として保存します。これらのパスの値は、意図した色を表すものではありませんが、 Nukeによってショット内で移動するオブジェクトの方向、速度、位置の変化を決定するために使用されます。

ScanlineRender ノード内のモーション ベクトル情報は、デフォルトで前方レイヤーに保存されますが、モーションレイヤーまたはカスタム作成レイヤーに保存することもできます。

生成されたこの動きベクトル情報を VectorBlur ノードに読み込むことで、より高速なレベルの画像処理が可能になります。このプロセスは、ScanlineRender ノードから生成されるレイヤーとしてUV チャンネルソースを定義するのと同じくらい簡単です。いくつかのプリセット オプションがありますが、最良の結果を得るには、 Nuke ScanlineRender プリセットをお勧めします。

このワークフローにはいくつかの利点があります。

1) VectorBlur ノードには処理に GPU を使用するオプションがあるため、マシンが GPU アクセラレーションの推奨仕様に一致している場合、このプロセスは非常に効率的になります。

GPU アクセラレーションの推奨最小仕様の詳細については、次のリンクを参照してください: Nukeシステム要件

2) VectorBlur ノードは、u 値と v 値を通じて 2D ベースの情報のみを解釈するため、必要な処理量が削減されます。

3) VectorBlur ノードとモーション ベクトルの計算は ScanlineRender ノードの外部にあるため、VectorBlur ノード自体を無効にすることでモーション ブラーを簡単に無効にできます。

4) 動きベクトルの計算は 2D データとしてレンダリングしてNukeに読み戻すことができ、その後、3D シーンによる以前の処理を完全に回避するために使用されます。

以下は、このプロセスを再作成する手順のリストを含むワークフローの例です。

ワークフローの例

このプロセスには 2 つのフェーズが必要です。最初のフェーズは、ScanlineRender ノードでモーション ベクトル パスを正しく作成することであり、2 番目のフェーズは、これらのモーション ベクトル パスを VectorBlur ノードに正しく統合することです。

フェーズ 1: スキャンラインレンダリング

1) 3D オブジェクトのシェーダーとして使用する CheckerBoard ノードを作成します。

2) Sphere ノードを作成し、 translate xの値「-2」にキーフレームを設定し、フレーム 10 の値「2」に別のキーフレームを設定します。(これは、3D 空間で球をアニメートし、基礎を作成するために使用されます)モーションブラーの)

フレーム1 フレーム10

フレーム1.PNGフレーム10.PNG

3) Sphere ノードのimg入力を CheckerBoard ノードに接続します

4) Camera ノードを作成し、 translate z値を「10」に設定します。 (これにより、球が 3D 空間にフレームアップされます)

5) ScanlineRender ノードを作成し、Camera [3D Classic] ノードをcam入力に接続し、Sphere ノードをobj/scn入力に接続します。

6) ScanlineRender 内で、MultiSample タブのサンプル値ノブが「1」に設定されていることを確認します。

7) また、Shader タブのモーション ベクトルのノブが「距離」に設定され、モーションベクトルチャネルが「前方」に設定されていることを確認します。

Screen_Shot_2018-06-22_at_5.15.58_PM.png

フェーズ 2: VectorBlur

1) VectorBlur ノードを作成し、入力を ScanlineRender ノードに接続します。

2) UV チャンネルノブを変更し、「 forward 」レイヤーに設定します。

3) mv presetsノブが「 Nuke ScanlineRender」に設定されていることを確認します。

4)ブラー UVノブを変更し、「リニア」に設定します。 (これがデフォルトのままの場合、エッジに不正確な補間が作成されます)

5)モーション量ノブを変更し、必要なモーション ブラーの量を設定します。

6)モーションフォールオフノブを「 0.2 」の値に変更します。 (このコントロールは、意図した補間に応じてフォールオフを制御するために使用できます)

7) この例のように、ScanlineRender ノードの出力が黒で、バウンディング ボックスを使用して画像自体の領域だけを計算する場合、拡張ブラー bboxノブをバウンディング ボックスが許可される値に変更する必要があります。画像をカットしません。

このサイズは入力画像によって異なります。この例では値「 50 」を使用しています。

以下にさまざまな値の比較を示します。

ぼかしを拡大 bbox = 0ぼかしを拡大 bbox = 50

bbox_0.PNGbbox_50.PNG

注:上記のワークフローは、添付のスクリプトAlternative3DMotionBlur.nk内でも再作成されています。

結果比較テスト

例として、元のプロセスと VectorBlur が提案した代替プロセスとの比較を記録した画面が添付されています: Alternative3DMotionBlur_comparison.mp4。

さらに、次の添付スクリプト内に、このテストを自分で実行できる比較テストを追加しました: Alternative3DMotionBlur.nk

以下は、上記の記録からの 2 つの比較イメージです。25 フレームのレンダリングを比較すると、VectorBlur ノード経由で生成されたモーション ブラーが著しく高速であることがわかります。

ベクトルぼかし

ベクターブラー.jpg

スキャンラインレンダー

スキャンライン.jpg

注: ScanlineRender ノードのモーション ブラー サンプルは、同じ結果を達成するために必要な最小限のサンプルを使用して、可能な限り厳密に一致しています。

上記の比較から、ScanlineRender ノードのサンプルを増やす代わりに VectorBlur ノード内でモーション ベクトルを使用すると、必要な処理量が削減されることがわかります。これは、大規模で複雑な 3D レンダリング ベースのスクリプト内でより顕著になります。

注:このプロセスは、ScanlineRender ノードの代わりに RayRender ノードを使用して実行することもできます。これが正しく機能するには、RayRender ノードの「AOV」タブ内の次のオプションを変更する必要があります。

レイレンダー.PNG '

1) [出力 AOV]チェックボックスをオンにする必要があります。

2) 正しいレイヤーを出力するようにモーション ベクトルパスを設定する必要があります。この例では「前方」レイヤーの上からのものです。

参考文献

VectorBlur ノードと ScanlineRender ノードの両方の詳細については、 Nukeドキュメントへの次のリンクから参照できます。

ベクトルブラーノード
ScanlineRenderノード

私たちはそれを聞いて申し訳ございません

理由をお聞かせください