6回に渡り執筆してきました本連載も今回で最終回となります。最後はシーケンサーからの動画出力に焦点を当ててお話ししていきたいと思います。
■フレーム単位で絵をつくりたい
まずは出力の前に、出力の結果をどれだけ事前に確認できるかというポイントから入りたいと思います。リアルタイムコンテンツであれば、リアルタイムに再生した結果が最終形ですが、映像出力では動画形式に固められたものが最終形です。再生されてしまえば見た目には大きな違いは無いようにも思えますが、データの持ち方としては全くの別物です。映像屋ならではの考え方かもしれませんが、ほんの小さな変化でも演出意図に影響が出ないかどうかをフレーム単位で確認します。どのフレームでどういう絵になるか、細かく制御したくなってしまうものです。
たとえば、前回作成したカットイン演出の流背部分はPannerノードのTimeによって動きが制御されているため、フレーム単位で意図的に見え方を制御することができません。fig01のようにシーケンサーのタイムスライダを止めている間も流背だけは常に動き続けていることが分かります。ちなみに稲妻素材に使用しているMediaTrackは元々シーケンサーと同期しているためフレーム単位で制御が可能です。
fig01. シーケンサーと同期せず常に動き続けている流背
この場合は“Timeをマテリアルパラメータコレクションに置き換える”という手法が有効です(fig02,03)。この手法は下記参考ページで紹介されているため是非確認してみてください。
参考:学生による短編映画 FRAGMENT が描く荒廃した世界
fig02. PannerノードのTimeをMPCのパラメータで置き換え
fig03. シーケンサーと同期が可能になった流背
もうひとつ、フレームごとに確認したい例としてモーションブラーのかかり具合が挙げられます。しかしこちらは再生されていて動きのある状態でないとブラーの計算に使用されるモーションベクターが止まったままのため、残念ながら非再生時にはモーションブラーはかかりません。少々不便ですが、出力した動画で確認する必要がありそうです。(fig04)
fig04. モーションベクターは Show > Visualize > Motion Blur から確認可能
■レンダリング結果が毎回変わらないために
シーケンサーからレンダリングを実行するたびに違う結果が出力されるのも、できれば避けたい現象のひとつです。一度のレンダリング出力で完成できるのならなんら問題はありませんが、おそらくは何度かレンダリングを繰り返し少しずつ完成度を高めていくことになるでしょう。リアルタイムレンダリングによりトライ&エラーを高速に回せることも大きなメリットですので、この過程で不必要に毎回絵が変わり作業の妨げにならないよう注意したいところです。
具体的には、その都度乱数で生成されるものや、前項でも挙げられたTime系などが該当します。例えば、前回紹介した画ブレを追加するブループリント「CameraShake」の場合はInitial Offsetを「Random」から「Zero」に変更することで解消できます(fig05)。物理演算であればシーケンスレコーダーを使用することでアニメーションのベイクが可能ですし(参考:UE4 シーケンサー上の物理演算をアニメーションベイクする - Let's Enjoy Unreal Engine)、DCCツールからインポートしてきているものについては可能な限り事前にベイクしておくことでも解消できます。
fig05. BP_CameraShakeのパラメータ
■基本的な出力設定
レンダリング出力の方法はいたってシンプル、「Render Movie Settings」からまず確認すべき項目は、フォーマット、解像度、圧縮レベル、最下部のWarm Up系パラメータくらいです。その他は原則デフォルトのままでも特に問題はないでしょう。(fig06)
fig06. Render Movie Settingsのオプションウィンドウ
WarmUp関連の3つのパラメータはドキュメントに以下のような記載があります(fig07)。出力解像度が大きかったりPCのスペックが不足していると、カットの冒頭が不安定になりやすくこれらのオプションがより重要になってきます。
fig07. ドキュメントのWarm Upオプション解説
■アンチエイリアス
どうしてもリアルタイムレンダリングの特性として回避しきれない問題がアンチエイリアスの精度です。映像屋さんがプリレンダーで使用するレンダラーには大抵サンプリング数のパラメータが用意されており、これを上げれば上げるほど計算時間と引き換えにノイズやジャギーが滑らかになっていきます。
例)
・Image Sampler - Anti-Aliasing - V-Ray 3.6 for 3ds Max - Chaos Group Help
・Samples - Arnold for Maya User Guide 5 - Arnold Renderer
しかし速度が重要なゲームエンジンでは上記のようなダイレクトに計算時間に影響する手法ではなく、まったく別の手法が採用されています。まずは下記参考をご確認ください。
参考:NVIDIA,独自のアンチエイリアシング技法「FXAA」「TXAA」をアピール。いまあらためて振り返るアンチエイリアシングの歴史 - 4Gamer.net
UE4のデフォルト設定はTemporalAAになっています。非常に強力で時間軸のチラツキにも強くエディタ上では再生時も含めかなり滑らかに描画されます。しかし出力した連番画像をよく見てみると、AA無し、FXAAと比べてディティールの細かい部分や高輝度のスペキュラーが潰れやすいことがわかります(fig08)GIFでは少々わかりにくいですが、TemporalAAでは動きの滑らかさと引き換えに髪やまつ毛のディティール、目のハイライトの輝度が失われています。(fig09)

fig09. 同じくAA無し、FXAA、TemporalAA の動画再生時の比較
少々手間ですが、ここだけは割り切ってUE4より後の工程で解決しましょう。Project Settings の Rendering 項目から「Anti-Aliasing Method」を「None」に変更しAAを無効にします。(Fig10)
fig10. Project Settings の Anti-Aliasing Method
そして、レンダリング出力で解像度を4倍近くまで引き上げます(fig11)。ちょうど先ほどの参考記事で「非常に“重い”のが欠点」と解説されているベーシックな手法「SSAA」に近いイメージです。処理の重さを妥協できる映像出力だからこそあまり消極的にならずに採用できる手法かと思います。
Fig11. Render Movie Settings のResolutionを設定
UI上ではCustomでも最大7680pxに制限されていますが、コマンドライン出力では強制的にこれを超えることができます。ただし、あまり解像度が大きすぎると負荷が上がり不安定になる恐れがあるため上げすぎは禁物です。(fig12)
fig12. 8kでのレンダリングコマンド例。ドキュメントには記載がないが解像度指定には「-Windowed」フラグが必要。
解像度4倍で出力した画像を後処理で25%に縮小し元のサイズに戻しました。fig13の上段が先ほどの1倍解像度、下段が4倍解像度を縮小したものです。圧倒的にディティールがきれいに保たれ、各AAごとの差も縮まっていることがわかります。AA無し+高解像度で十分に滑らかになればおそらくこれがベストですが、ディティールの量やレンダリング解像度によっては、なんらかのAA手法と解像度上げを組み合わせる選択肢もアリだと思います。
fig13. 解像度4倍での出力結果を縮小。縮小時のリサンプル手法はLanczos。
■おわりに
CG映像屋の目線でUE4の活用をご紹介してきた本連載も無事終了となります。実際にゲームエンジンについていろいろと調べてみると、プリレンダリングとリアルタイムレンダリングでは手法や着目点などこんなにも違うものかと驚かされました。UE4はアップデートが非常に盛んで次々に新機能が追加されていっています。私も毎度追いつくのが大変ですが、今後のさらなる進化に期待したいと思います。
最後に、本文中では紹介しきれていませんが大変お世話になった参考リンクをいくつか紹介させていただきます。
• UE4 映像制作者向けTips - Let's Enjoy Unreal Engine
• UE4のシーケンサーをもっともっと使いこなそう!最新情報・Tipsをご紹介!
• デジタル・フロンティア-Digital Frontier DF TALK 【UnrealEngine4】を映像制作で使うためのTips
• 猫でも分かるUE4のポストプロセスを使った演出・絵作り
• CEDEC2016 Unreal Engine 4 のレンダリングフロー総おさらい
ジェットスタジオは2001年に発足し現在まで、フルCGの映像を中心にアニメ・ゲーム・パチンコなど様々なコンテンツの3DCG制作を行ってきた会社です。詳細は公式HPやFacebookページをご覧ください。
(関連記事)
【連載】第1回:映像制作におけるUE4のためのキャラクターデータ構成(モデリング編)
【連載】第2回:映像制作におけるUE4のためのキャラクターデータ構成(リギング編)
【連載】第3回:映像制作におけるUE4の活用~マテリアル設計~