最新物理ベースレンダラー Mitsuba2を触ってみる (1) 導入編

# Mitsuba2とは
アカデミック向けのフリーの物理ベースレンダラー。レイトレーシングはもちろん必要十分な機能があり、更にソースが公開されていることもあり、前身のMitsuba(0.6)は長い期間、主に研究用途で使われてきた。そして様々な新機能が追加されパフォーマンスが改良されたMitsuba2が、つい先日Publicとなった。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215987/bdd230fc-4b01-3b63-cec3-79888b742683.png" width="150">
https://github.com/mitsuba-renderer/mitsuba2

他に書いた関連記事です。

 - [最新物理ベースレンダラー Mitsuba2を触ってみる(2) Pythonから動かす編](https://qiita.com/kurilab/items/2ad1dd3d0676c1cf4c74)
 - [最新物理ベースレンダラー Mitsuba2を触ってみる(3) 微分可能レンダリング編](https://qiita.com/kurilab/items/5f270ebf8ee28a25cd92)
 - [最新物理ベースレンダラー Mitsuba2を触ってみる(4) 偏光レンダリング編](https://qiita.com/kurilab/items/c96ee592dbde0416576e)
 - [BRDFと偏光BRDF(pBRDF)の違い](https://qiita.com/kurilab/items/f9e48045bd1b9c130d0b)

# Mitsuba2の主な新機能
![mitsuba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215987/05692e7a-f6df-44eb-cd8f-bd40419b6cc2.png)

1. 微分可能(differentiable)なレンダリングが可能
2. 偏光レンダリングが可能
3. CPUレンダリング時のSIMD演算可能

面白いのが1と2です。次の記事では1の[微分可能レンダリング](https://qiita.com/kamata1729/items/eaf1d7b945b3a61a4fdd#_reference-0c107c65a89b694a56ef)と2の[偏光レンダリング](https://qiita.com/kurilab/items/c96ee592dbde0416576e)を触ります。
今回は基本のセットアップからレンダリングテストまで書きます。

# インストール手順（Windows）
**※2020年3月10日時点での情報です。**
ここではWindowsの手順だけ述べますがMacOSやLinuxでもビルド可能です、公式の手順を参照してください。
https://mitsuba2.readthedocs.io/en/latest/src/getting_started/compiling/
（ちなみにMacOSは微分可能・GPUレンダリング未対応なのでそもそもおススメしないです。未対応の理由は端的に言うとNVIDIAとAppleが喧嘩してるから。）

- 必要なもの（確認バージョン）
 - Git (2.23.0)
 - CMake (3.16.5)
 - Visual Studio 2019　(MSVC1924以上が必要とのこと)
 - Python (3.7.4)
- GPUを使う場合は上記に加えて
 - NVIDIA CUDA Toolkit (10.0,10.1,10.2のいずれかが必要、私は10.1で確認)
 - NVIDIA OptiX (6.5じゃないと駄目とのこと)
 - NVIDIA Driverのバージョンは最新にしてください（私がこれでハマりました… [Issueで報告したので現在はわかりやすいエラーメッセージが出るようになっています](https://github.com/mitsuba-renderer/mitsuba2/issues/28)）
  
それぞれPATHを通してください。

## Git Clone
公式のGitHubリポジトリは以下です。
https://github.com/mitsuba-renderer/mitsuba2

```bash
git clone --recursive https://github.com/mitsuba-renderer/mitsuba2.git
```
外部ライブラリが無いとビルド時に怒られるので必ず```--recursive```オプションをつけてください。

## バリアント（レンダリング設定）の選択
**（普通のレンダリングだけをやりたい人は、このステップは何もしなくてよいです。飛ばしてください）**
次に、ビルドするレンダラーのレンダリング設定（＝バリアント）を指定します。**新機能を使う場合はこのステップが一番忘れやすいので注意です。**

Mitsuba2では、開発者が求める必要最低限の機能、最小構成でビルドするために39種類ものバリアントが用意されています。例えばトレースする光線１つとっても「単色」「RGB」「スペクトル」「偏光」まで様々な要素がありますが、全て必要とは限りません。なので、ビルド時にそれらの構成を指定することで、必要十分の機能でビルドし、コンパイル時間の削減・プロジェクト規模の削減などを行います。

Mitsuba2のバリアントは、mitsuba.confで指定されます。まずデフォルトのテンプレートをルートディレクトリにコピーします。

```bash
cp resources/mitsuba.conf.template mitsuba.conf
```

次になんでも良いのでエディタで`mitsuba.conf`を開き、ビルド構成の宣言を書き換えます。
デフォルトでは以下のようになっています（70行目あたり）。

```
"enabled": [
    # The "scalar_rgb" variant *must* be included at the moment.
    "scalar_rgb",
    "scalar_spectral"
],
```



新機能（微分可能、偏光レンダリング）をやりたい場合、下のように追加してください。

```
"enabled": [
    # The "scalar_rgb" variant *must* be included at the moment.
    "scalar_rgb",
    "scalar_spectral",
    "scalar_rgb_polarized",
    "gpu_autodiff_rgb"
],
```

**"gpu_autodiff_rgb"はGPU環境依存が結構あるので、CMakeやビルド時にうまくいかない場合はコメントアウトして、一度他のバリアントで上手くいくか試すことをお勧めします。OptiXが見つからないよと怒られる場合はcmake時に-DMTS_OPTIX_PATH=""を指定し""の中にOptiXをインストールしたPATHを指定してください。**
他にも、倍精度演算やSIMD演算等、様々なビルド構成がありますので、適時用途によって使い分けてください。
https://mitsuba2.readthedocs.io/en/latest/src/getting_started/variants/
上では４つのバリアントを指定していますが、必要ないものは適時消してください。指定するバリアントが多ければ多いほど比例してビルド時間が長くなります。自分の必要な構成だけにするのが理想です（ただし"scalar_rgb","scalar_spectral"はないとエラーが出る）。

## コンパイル
CMakeでビルド構成を生成します。Pythonを自動で検出するので、Pythonがないとエラーが起きます。
そのままcmakeすると散らかるので、できればbuildディレクトリを作ってその中でやりましょう。

```bash
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019" -A x64
```

生成された`./build/mitsuba.sln`をVisual Studio 2019で開きます。
ビルドモードをReleaseにして、ビルドを通常のように行います。

無事ビルドが完了すると`./build/dist/mitsuba.exe`と、実行ファイルが生成されます。

# レンダリングテスト
mitsuba2のサンプルデータのリポジトリは以下になります。
https://github.com/mitsuba-renderer/mitsuba-data

```bash
git clone https://github.com/mitsuba-renderer/mitsuba-data.git
```

`mitsuba_data/scenes/cbox`をディレクトリごと、事前に生成した実行ファイルのディレクトリ`mitsuba2/build/dist/`にコピーしてください。

`mitsuba.exe`にxml形式のシーンファイルを渡すことでレンダリングできます。
`mitsuba2/build/dist/`内で以下のように実行します。

```bash
./mitsuba.exe ./cbox/cbox-rgb.xml
```

レンダリングが終了したら、`./cbox/cbox-rgb.exr`というファイルが生成されています。これが最終レンダリング結果です。
exrは小数32bitx3ch形式のRGB画像です、Photoshopなどで開けます。[Venetaビューア](https://sourceforge.net/projects/veneta-viewer/)や[DJV](https://darbyjohnston.github.io/DJV/)等のフリーのソフトもあります。
以下のようなコーネルボックスの画像が生成されていたら成功です。
![cbox_mitsuba2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215987/cf3f687e-dc9d-9953-6005-03f509818a23.png)

# 実行オプション
mitsuba2のレンダリング実行時は様々なオプションが指定できます。
下記コマンドでオプションを確認できます。

```bash
./mitsuba.exe -h
```

特に重要なオプションは以下の２つです。

```
-m : 先に設定したバリアントのうちレンダリングモードになにを使うかを決める（RGB・偏光、微分可能など）
-D <key>: xmlシーンファイルに設定されている変数$keyにkeyを設定する
```

レンダリングモードの指定は偏光レンダリングを行う場合など新機能を使う場合には必須です。
シーンファイルへの値の代入は、例えばカメラを少しずつ動かしたい場合など、パラメータ変えて次々にレンダリングしたい場合には必須です（少なくとも外部から実行ファイルを叩く運用時には）。

# まとめ
Mitsuba2のインストールから、レンダリングテストまでを行いました。
次回はPythonからMitsuba2を動かすやり方を紹介します。

 - [最新物理ベースレンダラー Mitsuba2を触ってみる(2) Pythonから動かす編](https://qiita.com/kurilab/items/2ad1dd3d0676c1cf4c74)

その後は微分可能レンダリングや偏光レンダリングなど新機能の使い方を解説します。

 - [最新物理ベースレンダラー Mitsuba2を触ってみる(3) 微分可能レンダリング編](https://qiita.com/kurilab/items/5f270ebf8ee28a25cd92)
 - [最新物理ベースレンダラー Mitsuba2を触ってみる(4) 偏光レンダリング編](https://qiita.com/kurilab/items/c96ee592dbde0416576e)

以上です。