[UE4] 映像向け機能 Movie Render Queue について


映像向けの機能として、UE4.25で追加された**Movie Render Queue**(High Quality Media Export)ですが、UE4.26でも更に進化しました。
様々な機能を備えるMovie Render Queueの中で特に注目の機能を数値検証結果などを交えて紹介します。

**※Movie Render Queueは、UE4.26の時点でベータ機能です。**

# Movie Render Queueとは？
シーケンサーのレンダー ムービーの後継機能で、動画出力、連番画像出力が可能な機能です。
質の高いアンチエイリアシングやパス出力、高解像レンダリング機能を備え、従来のレンダームービーより使いやすく、高品質な画像が出力できます。
4.26では、出力可能なパスも増え、マルチレイヤーのEXRも出力できるようになったため、Aftter EffectsやNukeを使用したコポジットフローなどオフラインレンダリングのワークフローにも取り入れやすくなりました。

公式ドキュメントは以下になります。
・[ムービー レンダー キューの概要](https://docs.unrealengine.com/ja/AnimatingObjects/Sequencer/Workflow/RenderAndExport/HighQualityMediaExport/index.html)
・[Movie Render Queue を使用して高品質なレンダリングを行う方法](https://docs.unrealengine.com/ja/RenderingAndGraphics/RayTracing/MovieRenderQueue/index.html)
・[Movie Render Queue レンダリング パス](https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HighQualityMediaExport/RenderSettings/RenderPasses/)
・[レンダリング設定](https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HighQualityMediaExport/RenderSettings/)
・[画像設定](https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HighQualityMediaExport/RenderSettings/Reference/)
・[エクスポート形式](https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HighQualityMediaExport/RenderSettings/OutputFormats/)
・[静止画像のレンダリング](https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HighQualityMediaExport/StillImage/)
・[ランタイム ビルドでムービー レンダー キューを使用する](https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HighQualityMediaExport/RuntimeBuilds/)


以前に開催したイベントでも初心者向け、かつ映像制作者向けにシーケンサーとMovie Render Queueの使い方を解説しています。
<iframe width="560" height="315" src="https://www.youtube.com/embed/QKVXbsyL-_o" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>



# レンダリングパス
![pass.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/c375de80-2fd6-99bd-b09b-34a195663550.gif)





現状、MRQでは以下のレンダーパスが出力できます。

- Deferred Rendering(Beauty)
- Ambient Occlusion
- World Depth
- ObjectID(Cryptomatte)
- World Normals
- Reflections
- Motion Vectors 
- World Position
- Detail Lighting
- Lighting Only
- Unlit(Albed)
- Path Tracer
- Stencil Layer
- UI(UMGを別素材として出力可能)
 
**マルチレイヤーのEXRも対応しているため、これらのパスは１つのEXRファイルにまとめることも可能です。**
ObjectIDも単純なカラーマップではなく、**Cryptomatte**になっています。

### レンダーパスの追加方法
上記のレンダーパスの出力の仕方は、基本的にドキュメントに記載があるので省きますが、AOなどのレンダーパスの追加の仕方が少しわかりづらいので紹介します。

基本的には、Defferd Renderingの設定項目で**Defferd Renderer Data**という項目で出力するパス(マテリアル)を設定します。
デフォルトでは、World Depth(Z-Depth)とMotion Vectorsが設定されています。
**+**を押すことで、マテリアルスロットが増えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/10eaec02-ce34-7a0d-1c0f-36b9cf0cfa4d.png)

マテリアルのBrowseで「Movie」などと検索すると、あらかじめ準備されたマテリアル(パス)が出てきます。
表示されない場合は、**View Options**の「**Show Plugin Content**」に☑を入れてください。
「**MovieRenderQueue_~**」というマテリアルが現状、用意されている出力可能なパスになります。
これらのマテリアルをセットすることで出力するパスの追加ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/e3787993-0f1d-8a39-7537-010832810228.png)
ちなみに、マテリアルを追加しても**Enabledに☑**を入れないと、出力されないので注意してください。

### Motion Vector出力時の注意点
Motion Vectorを出力する際は
プロジェクト設定で**「Output Velocities During Base Pass (基本パス時の出力速度)」を有効**にし
CVarの**r.BasePassForceOutputsVelocity を 1** に設定しないとうまく正しく出力できないので、お気を付けください。

また、After Effectsなどで使用する際は、必要なレンジにノーマライズする必要があります。
![2021-12-15_12h37_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/7da196ba-0a0e-9423-75c3-ca952ec7a18e.png)

DepthもMotion Vector同様にレベル補正などを使用し、ノーマライズする必要があります。
![2021-12-15_12h36_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/f6b91ef8-ab5c-264c-4f4e-2c90e6489dc2.png)

NukeでのMotion Vector、Depthの使い方は、ドキュメントの[Movie Render Queue レンダリング パス](https://docs.unrealengine.com/4.27/ja/AnimatingObjects/Sequencer/HighQualityMediaExport/RenderSettings/RenderPasses/)に記載がありますので、Nukeをお使いの方は、そちらをご覧ください。


# Anti-aliasing
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/9ba5d08e-f9be-f5c5-2e14-007e1cb64f91.png)


### Spatial Sample Count と Temporal Sample Count
設定項目の一つにAnti-aliasingがあります。
ジャギーの対処はもちろん、レイトレーシングのノイズ削減にも効果があります。
サンプリングの方法はSpatial Sample Count(空間サンプリング)とTemporal Sample Count(時間サンプリング)があります。

Temporal Sample Countは、1フレームをサブフレームに分割します。
そして、分割された間もEngineのTickは動作しています。
サブフレーム間でもオブジェクトやカメラが動いた状態でレンダリングされた画像が合成されるため、綺麗なモーションブラーを得ることができます。
ホイールの回転などに特に有効です。

対して、Spatial Sample Countは、サンプル中に(サブフレームで)Tickは動作しないため、Temporal Sample Countのようなブラーは得られません(Post Effectによるブラーは付きます)。
逆にTemporal Sample Countは、ブラーが出てしまうため、レンダリングパスを出力する場合やコンポジットでブラーを付ける場合などは、こちらのサンプル方法の方が有用です。

### サンプル数よるノイズ削減効果とブラー
サンプル数が高いほど、レイトレーシングのノイズが削減、ブラーの品質に効果があります。
数値でどれくらい違うのか検証してみました。

検証環境は、UE4.26.0でRay Tracing ReflectionとRay Tracing AOのみ使用しています。
Sphereにノイズが顕著に出やすいラフネス値のマテリアルを使用し、タイヤは回転させています。
また、ReflectionとAOのデノイズは無効にしています。

![noAA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/5801795b-7778-f1f7-069f-dc453c40e370.png)
Anti-aliasing 未設定

![SSC_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/cf48a794-5839-6953-a9b6-39d68a20f69b.png)
Spatial Sample Count: 8

![ssc_256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/2fac062c-2dcb-0d7d-91ad-f6e247746813.png)
Spatial Sample Count: 256

![TSC_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/0fb34aed-2880-f5b3-adc8-c38a3d10f624.png)
Temporal Sample Count: 8

![TSC_256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/09f526b1-6c89-3c8c-d5a8-ff9e35f339df.png)
Temporal Sample Count: 256


マテリアル表面のリフレクションのノイズや床との接地面付近のAOノイズが減っているかと思います。
検証してみた、所感としては、シーンにもよりますが、128、256以上からは、ノイズなどの減り具合やブラーの質はレンダリング時間の割りに変わらない印象でした。

また、レイトレーシングのノイズの削減方法としては、他に

- ライトやリフレクションなどの各Sample Per Pixelの値を上げる
- Bloomをなくす
- DoFを切る
- レンダリング解像度を上げる

といったことが有用です。

### Anti-aliasingの注意点

サンプル数が上がるほど、ノイズは減りますが、数値を倍にすると倍ノイズが減るというわけではありません。
そして、上げるほど、レンダリング時間が増えるので注意してください。

また、Temporal Sample Countの数値を上げると以下のようなエラーが出ることがあるかと思います。
`Too many temporal samples for the given shutter angle/tick rate combination.`
これはShutter angleの値が小さいことが問題で、この数値を上げることで解決します。

4.25では、MRQのCameraの設定にCamera Shutter Angleがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/ef3d7616-4624-c453-cfcf-07af522973a3.png)

ただ、4.26からはPost Process のMotion Blur の Amountの値がCamera angleの値とイコールになりました。
4.25のCamera Shutter Angle:180 が 4.26のMotion Blur Amount: 0.5となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/72ba713d-a999-d668-e714-b9f90ca4618a.png)


## High Resolution(高解像度レンダリング)
High Resolutionは、1フレームのレンダリング画像をタイル化し、分割してレンダリングした後に合成します。
従来のレンダームービーなどだとGPUがクラッシュしてしまうような8K以上などの高解像度のレンダリングも可能になります。
詳しい設定方法は、こちらをご覧ください。
[**High Quality Media Export のリファレンス ガイド**]
(https://docs.unrealengine.com/ja/AnimatingObjects/Sequencer/Workflow/RenderAndExport/HighQualityMediaExport/Reference/index.html)
また、**4.26の時点では、下記の機能が対応していない**ので注意してください。

- Auto Exposure
- スクリーンスペース系のエフェクト(Bloom, Lens Flareなど)
- TAA(上記のTemporal Sample Countとは別)
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/dd9ba25e-f9fd-0765-b76a-7d88d995cdfd.png)




## Console Variables
Console Variablesの設定では、レンダリング時のみなどに適用するCVarを設定することができます。
例えば、**エディタ操作時は重くならないように、レイトレーシングのSample Per Pixelの値を低くしておき、レンダリング時のみ高い値にして、ノイズを取り除く**といったことが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1006571/9c29350f-542b-512b-b8bf-3a017729701c.png)

ここで使用するようなCVarの例は、[こちらのドキュメント](https://docs.unrealengine.com/ja/RenderingAndGraphics/RayTracing/MovieRenderQueue/index.html)の下の方で紹介されています。
***

Movie Render Queueの追加で、より以前よりUnreal Engineでの映像制作しやすくなりました！
ぜひ、映像制作に役立ててみてください！