3DCGに After Effects でボケ表現を加える方法

# はじめに
ボケ表現は、注視して欲しい対象を際立たせたり、自然な印象を与えるために利用されています。

![Bokeh.png](https://qiita-image-store.s3.amazonaws.com/0/74764/bfaecb91-c6e8-8c7e-a971-f2f059b58982.png)

本投稿では、3DCGの動画にボケ表現を加えるための方法について説明します。

## 環境
* Autodesk Maya 2017 Update 5
* Arnold 5.0.1.0 (MtoA 2.0.1)
* AfterEffects CC 2017

# ボケを加える方法
ボケ表現を加える方法として、以下の方法が挙げられます。

* Arnold でのレンダリング
* AfterEffects でのコンポジット

## レンダリングでのボケ表現
 Arnold レンダラーでのボケ表現について、SolidAngle の[マニュアル](https://support.solidangle.com/pages/viewpage.action?pageId=63799655#id-カメラ-EnableDOF)に記載されています。レンダラー内蔵の機能なので、高品位なボケ表現を得ることができます。

![Shot03.0001.jpeg](https://qiita-image-store.s3.amazonaws.com/0/74764/478f3210-4c46-a137-f993-55f1a53beafe.jpeg)


しかし、この方法には以下のような問題があります。

* レンダリングに時間がかかる
* 編集時の微調整ができない

### レンダリングに時間がかかる

ボケ表現を有効にすると、レンダリング時間が長くなります。上記の例の画像を出力するのにかかった時間を比較すると以下になります。

| ボケ表現       |    あり    |    なし    |
|:--------------|:----------:|:---------:|
| レンダリング時間 | 15分14秒   |   10分43秒   |

静止画を作る場合であればそれほど問題になりませんが、動画となると枚数が多いので、レンダリングにかかるコストが跳ね上がります。

### 編集時の微調整ができない

レンダリング時にボケ表現を加えると、レンダリングの後工程である編集工程で、修正が加えられないという問題が発生します。
ショットの繋がった映像を見て、ボケ具合の調整を行いたいといったことはよくあります。レンダリング時にボケを加えてしまうと、そのような修正を行うにはレンダリングし直すしか方法がなくなります。

## コンポジットでのボケ表現

レンダリング時にボケ表現を加える方法について問題があることが分かりました。この解決するために、コンポジットの工程でボケ処理を加えます。

![3d_production_timelines.jpg](https://qiita-image-store.s3.amazonaws.com/0/74764/26884910-e383-f874-576f-7b5e44d2ec7e.jpeg)

上の図は [Upcoming VFX Movies](http://www.upcomingvfxmovies.com/2014/03/3d-production-pipeline-pixar-vs-dreamworks/) から抜粋したものですが、3DCG の作業工程を分かりやすく図示しています。ボケ表現を適用する工程は、 **PRODUCTION** の最終工程ではなく、**POST-PRODUCTION** の工程で行うということです。

コンポジットでのボケ表現は、色情報と深度情報を合成することで実現します。Maya のレンダリング設定を色情報と深度情報を同時に書き出すように変更する必要があります。

# 手順

大まかに以下の手順でボケを実現します。

1. Maya から深度情報を含む EXR ファイルを出力する
2. AfterEffects で EXR ファイルを読み込む
3. 深度情報から深度マップを生成する
4. 深度マップを合成して DOF ブラーをかける

## OpenEXR

今回使用する [OpenEXR](http://www.openexr.com) というファイルフォーマットについて説明します。Maya の Render Settings ウィンドウの Image format を確認してください。exr という選択肢があります。これを選択することで出力フォーマットが OpenEXR に変更されます。

![Screen_Shot_2017-09-26_at_8_05_45.png](https://qiita-image-store.s3.amazonaws.com/0/74764/2164abfb-33fa-7353-a105-fe092c2b7d34.png)

なお、Arnold レンダリングで書き出すことのできる画像フォーマットは[マニュアル](https://support.solidangle.com/display/A5AFMUGJPN/Output)に記載があります。

OpenEXR には以下の特徴があります。

* HDRI
* マルチチャンネル

画像データは24bit で表されるのが一般的ですが、HDRI はより多くの色情報を含んでいるため、編集前の元データのフォーマットとして適しています。
マルチチャンネルとは、一つのファイルに複数の情報が含まれていることを意味しています。例えば、通常の色情報の他に深度情報やモーションベクターを一つの画像データとしてまとめることができます。

## EXR ファイルの書き出し

OpenEXR 形式のファイルを出力する方法を説明します。

### 出力設定の変更

Maya の Render Settings ウィンドウを表示して、Common タブをクリックします。出力フォーマットを **exr** に変更します。

![Screen_Shot_2017-09-20_at_22_03_11.png](https://qiita-image-store.s3.amazonaws.com/0/74764/07a6b7e3-00a5-9d51-37de-8c50a1f4e45b.png)

### AOV ブラウザの設定

深度情報を持った画像を出力するには、AOV(Arbitrary Output Variables) を変更する必要があります。 
Render Settings ウィンドウ の AOVs タブをクリックします。AOVブラウザの設定を行います。AOVブラウザの詳細については、 SoridAngle の[マニュアル](https://support.solidangle.com/display/A5AFMUGJPN/AOV#AOV-AOVBrowser)を参照してください。**Z** パスを Active AOVs のリストに追加します。 
設定後は、アクティブな AOV のリストに **Z** が含まれているか確認してください。 

![MayaRenderingSettings-AOVs.png](https://qiita-image-store.s3.amazonaws.com/0/74764/e4f616d0-8c6c-0b7b-ecb2-aca7c18d787d.png)

Select Driver を開いてください。

![Screen_Shot_2017-09-29_at_7_52_20.png](https://qiita-image-store.s3.amazonaws.com/0/74764/4852dc6f-df8c-de19-2e16-39d384d2594c.png)

**Merge AOV** のチェックボックスがオンになっていることを確認します。ここにチェックが入っていないと、チャンネル毎にEXRファイルが出力されます。

![Screen_Shot_2017-09-29_at_7_53_04.png](https://qiita-image-store.s3.amazonaws.com/0/74764/1b2b898b-770f-29a5-b374-141ab73322b9.png)
### レンダリングの確認

AOV を設定すると、Arnold のプレビューを確認することができます。

![Screen_Shot_2017-09-20_at_22_21_03.png](https://qiita-image-store.s3.amazonaws.com/0/74764/5d209d95-5dbe-cd5e-91fe-b3634b6ce8cb.png)

初期状態では画面は真っ白です。露出を変えることで深度情報が正しく出力していることが確認できます。

![Screen_Shot_2017-09-20_at_22_21_52.png](https://qiita-image-store.s3.amazonaws.com/0/74764/88cb6921-b422-ce78-4824-af6986084742.png)


### EXR ファイルの出力

現在のフレームのみ書き出すので、File メニューの、**Save Multi-Layer EXR** を選択することでEXRファイルを書き出すことができます。

![Screen Shot 2017-09-21 at 0.12.48.png](https://qiita-image-store.s3.amazonaws.com/0/74764/3a7a26f4-e24a-204d-773e-b4dd88a68aec.png)


## AfterEffects 上での操作

これまで、Maya 上で EXR ファイルを出力するところまで説明しました。ここからは、EXR ファイルを AfterEffects でマルチチャンネルのデータとして読み込み、深度情報を用いてボケ表現を加える方法を説明します。

### AfterEffects に ProEXR をインストール

AfterEffects は標準では EXR のチャンネル別の読み込みはサポートしていませんが、 [ProEXR](http://www.fnordware.com/ProEXR/) という優れたプラグインが [fnord software](http://www.fnordware.com/about/) から無償で提供されているので、こちらを利用します。

ProEXR のサイトからインストーラを入手してください。インストーラを実行してから、 AfterEffects を起動してメニューを確認してください。File メニューに **Create ProEXR Layer Comps** が表示されていたら準備完了です。

![Screen_Shot_2017-09-20_at_22_50_26.png](https://qiita-image-store.s3.amazonaws.com/0/74764/f800acba-8d0d-ab47-940a-0cbd01f2da32.png)

### EXR ファイルの読み込み

Maya で出力した EXR ファイルを AfterEffects に読み込みます。フッテージの読み込み方法については AfterEffects の[マニュアル](https://helpx.adobe.com/jp/after-effects/using/importing-interpreting-footage-items.html)の「フッテージアイテムを読み込む」の項目を確認してください。 
プロジェクトパネルで、EXRのフッテージを選択した状態で、メニューの **Create ProEXR Layer Comps** を実行します。すると、チャンネル毎にコンポジションが生成されます。このコンポジション群の中で **[Z] source** という名前のものが深度情報の画像になります。

![Screen Shot 2017-09-20 at 23.00.03.png](https://qiita-image-store.s3.amazonaws.com/0/74764/523be33a-d999-7393-2b15-1bffb25154bf.png)

### 深度情報の調整

プロジェクトパネルから深度情報のコンポジションを選択してみます。真っ白な画像が表示されているだけです。これは、深度情報は色情報とは値の範囲が異なるためです。フッテージを選択して、エフェクトパネルを確認してみてください。

![Screen Shot 2017-09-20 at 23.04.39.png](https://qiita-image-store.s3.amazonaws.com/0/74764/d186a5b0-07d8-724c-b9d6-2e093a68d371.png)

**ExtractoR** というエフェクトが既に適用されていて、**Black Point** が 0、 **White Point** が 1 という値になっています。
上のパラメータを調整することで、合成に必要な深度マップを作ることが出来ます。

![ExtractoR_Parameter.png](https://qiita-image-store.s3.amazonaws.com/0/74764/328b7d00-e38b-5648-8307-6e34310af194.png)


## ブラーの適用

深度マップが作成できたら、RGB 画像に DOFブラーを適用します。OpenEXR プラグインが生成したコンポジションに、各チャンネルをまとめたものがありますので、こちらを選択します。

![Screen Shot 2017-09-20 at 23.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/74764/7e6b8062-5a75-6f0f-361b-6445de6264b9.png)


RGBコンポジションを選択した状態で、エフェクトパネルから **Camera Lens Blur** を検索します。

![Screen Shot 2017-09-20 at 23.26.44.png](https://qiita-image-store.s3.amazonaws.com/0/74764/b857bbc6-1ba7-3039-9094-c946dc27f701.png)

**Blur Map** の **Layer** に深度マップを割り当てます。

![Screen_Shot_2017-09-20_at_23_29_25.png](https://qiita-image-store.s3.amazonaws.com/0/74764/61cc5aef-d0be-1507-67fe-c3ff64ecaf94.png)

これで深度マップをブラーとして適用できました。ピントのずれは各種パラメータを調整する必要があります。パラメータの詳細については、Adobe の[マニュアル](https://helpx.adobe.com/jp/after-effects/kb/5647.html)を参照してください。

## プラグインの紹介

今回の説明に使用した **Camera Lens Blur** で十分なボケ表現が得られるのですが、[Lenscare](https://www.flashbackj.com/frischluft/lenscare/)　というプラグインを使用することで、より高品位な結果が得られます。体験版を利用できますので気軽に効果を確認することができます。

## 作例

今回の方法で制作した作品を Vimeo で公開しています。

[![Screen Shot 2017-09-26 at 9.36.19.png](https://qiita-image-store.s3.amazonaws.com/0/74764/a6913b51-efee-be4f-7b77-4988a3370730.png) 8Ball on Vimeo](https://vimeo.com/234418104)

## 課題

なお、この方法でのボケ表現にはまだ欠点があります。**透過している物体の裏側にまでボケ表現を適用できない**ことです。
シンプルなシーンであれば、レンダリング時に前景と背景のレンダーレイヤーを分けることで問題を回避できそうです。しかし、複雑なシーンでは出力するレンダーレイヤーが膨大になるため現実的ではありません。今後はこの問題を回避する方法を模索していきたいと思います。

# 関連記事

- [3DCGに After Effects でモーションブラーを加える方法](https://qiita.com/karasusan/items/85f8f25c1cb61cff9fd1
)
- [ZYNCネットワークレンダリングを利用する](https://qiita.com/karasusan/items/91b762b899f469d2ffe5
)