【超入門】PBRT v4をM1Macで使いたい！

プログラミング超初心者のちなっちゃん（[@toremolo_72](https://x.com/toremolo_72)）です
研究で物理ベースレンダリングをしたくて、Physically Based Rendering(https://pbrt.org/) を入門しました！

GitHubでPBRTのリポジトリも公開されており、使ってみよう！と思いましたが、初心者に優しい日本語の解説記事（作業環境：Mac）がなかったので、書いてみようと思いました。

プログラマの彼氏（[@cha84rakanal](https://qiita.com/cha84rakanal)）が頑張って解説してくれて使えるようになったので、覚書として記事にしてみます！

初心者が書くので当たり前やろ！と思っている内容まで書かれていると思いますが、後世の初心者レンダラーさんたちに有用な記事になりますように🙏

# PBRTってそもそも何？

物理ベースレンダリングの名著です。現実だと分厚い辞書みたいな英語の本ですが、インターネットで無償公開されています。
光の反射とか拡散とかをできるだけリアルにシミュレーションしたい！と思った時の必読書になります。

※↓そもそも物理ベースレンダリングって何？という方はこちら

https://qiita.com/emadurandal/items/3a8db7bc61438245654d

https://zenn.dev/mebiusbox/books/619c81d2fbeafd

つぶやき）先日参加した学会[Visual Computing2024](https://visualcomputing.jp/vc2024/)の特別講演に著者の[Wenzel Jakob](https://www.mitsuba-renderer.org/~wenzel/)さん（この本だけじゃなくて、Mitsuba3とかも作ってるすごい人）が来ていて、すごー！！ってなってました。

# 実行環境
- 使用PC：　MacBookPro
- チップ ：　Apple M1
- メモリ ：　16GB
- macOS：　Sonoma 14.5

# PBRT-v4の使い方
ここからは、実際にPBRTを使えるように環境を作っていきます！
（懇切丁寧に日本語解説することを心がけます！）

## 環境を作ろう！

### 自分が作業したいファイルに移動する
まず、ターミナルを開いて、自分が作業したいファイルに移動します

```command:ターミナルで叩く：自分が作業したいファイルに移動
$ cd 自分が移動したい先のファイル名
```
例えば、私だったら、"neko"というファイルの中に作業環境を作りたい！という場合は

```command:例）自分が作業したいファイルに移動
$ cd neko/
```
という感じです。キーボードのTabでファイル名は補完されるので、"ne"を打ってからTabキーを押すと、"neko/"と自動で補完してくれます。
これができたら、ターミナルのコマンドラインの左側に、移動した先のファイル名が以下のように表示されます！

```command:これができてたらOK！
~@MacBook-Pro neko %
```
### GitHubに公開されているpbrt-v4リポジトリをクローンする

次に、GitHubに公開されているpbrt-v4リポジトリ(https://github.com/mmp/pbrt-v4) をクローンします。

:::note info
クローン：リモートリポジトリに保存されているプロジェクトのコードを、ローカルリポジトリに複製すること
:::

この作業は、GitHubのREADMEの以下の部分に該当します:
>As before, pbrt uses git submodules for a number of third-party libraries that it depends on. Therefore, be sure to use the --recursive flag when cloning the repository:

クローンするためには、以下のコマンドをターミナルで叩きます。ターミナルで叩きます、というコマンドは、最初の```$ ```は要りません。```git　〜```の部分をコピペします。

```command:ターミナルで叩く：プロジェクトを自分の作業環境に複製する
$ git clone --recursive https://github.com/mmp/pbrt-v4.git
```

一般的に、クローンするときは ``` git clone プロジェクトのURL```ですが、今回はpbrt-v4の作者さんたちだけでなく、GitHubに公開されている他のプロジェクトのリポジトリも使ってprbt-v4プロジェクトを作っているため、```--recursive```というコマンドを途中にいれています。他のプロジェクトをクローンするときには必要ないこともあるので、READMEをちゃんと読んで、必要かどうかを判断します！

もし、```--recursive```を忘れてクローンしちゃった場合は、以下のコマンドをターミナルで叩けば、連携している他のプロジェクトのプログラムコードもクローンできるので、安心してください！

```command:ターミナルで叩く：間違えて普通のgit cloneしちゃったとき
$ git submodule update --init --recursive
```

### cmakeを使ってコンパイルできるようにする

次に、cmakeを使ってコンパイルできるようにします。
この作業は、GitHubのREADMEの以下の部分に該当します：
>pbrt uses cmake for its build system. Note that a release build is the default; provide -DCMAKE_BUILD_TYPE=Debug to cmake for a debug build.

cmakeってなんだよ！って人が多いと思うので（私もそうだった）、どんなものかを超簡単に説明すると、

:::note info
cmake：（c言語系で使える）たくさんのファイルを実行する順番とかをよしなにやってくれるようにする便利なシステム
:::

という感じです（わかりやすさ重視のため厳密性に欠けるかもしれませんがご容赦ください🙏）
※↓こちら詳しく知りたい方はこの記事がおすすめです！！

https://qiita.com/sunrise_lover/items/589c4353d9547effc74b#%E5%B7%A5%E5%AD%A6%E7%B3%BB%E3%81%AB%E3%81%A8%E3%81%A3%E3%81%A6%E3%81%AEcmake%E3%81%AE%E5%A3%81

本当だったら、たくさんのファイルをどうやって実行しようかな？とかどの順番でやればいいのかな？とか色々考えなきゃいけませんが、cmakeのおかげでとりあえず決まったコマンドを叩いておけば動いてくれる！という感じになります。ありがたいですね〜！

ということで、自分の作業環境でcmakeを使えるようにします！

まず、cmakeをインストールします。brewが入ってれば簡単にできます！
※↓Homebrewを入れるにはこちら

https://qiita.com/to3izo/items/3171220733d0e2d18bfb

ここでは、brewが入っている前提で、以下のコマンドをターミナルで叩きます。

```command:ターミナルで叩く：cmakeをインストール
$ brew install cmake
```

以下の4つコマンドを無心になってターミナルで叩きます。

まず、クローンしたリポジトリに移動します。

```command:ターミナルで叩く：クローンしたリポジトリに移動
$ cd pbrt-v4
```

次に、"build"ディレクトリを作成します。

```command:ターミナルで叩く：buildディレクトリを作成
$ mkdir build
```

buildディレクトリに移動します。

```command:ターミナルで叩く：buildディレクトリに移動
$ cd build
```

cmakeを起動します。起動の方法は２種類あります。

1つは、**リリースビルド**と呼ばれる、いわば製品レベルの実行です。このモデルを使いたいときは、以下のコマンドを叩きます。製品レベルということは、修正せずに使用できる＝修正できることを想定されていない＝デバッグしにくい、という性質があります。
```command:ターミナルで叩く：リリースビルドでコンパイル
$ cmake ..
```
これに対して、**デバッグビルド**と呼ばれる、開発レベルで実行できるモードを選ぶことができます。こちらは、リリースビルドとは違い、デバッグしやすいという性質があります。私は研究目的で用いるため、デバッグビルドを選びました。

```command:ターミナルで叩く：デバッグビルドでコンパイル
$ cmake ..　-DCMAKE_BUILD_TYPE=Debug
```

これで、以下の文字列が出力されたら準備完了です！
```command:これができてたらOK！
-- Configuring done (3.0s)
-- Generating done (0.7s)
```

## 実際に計算させてみよう！
ここからは、PBRT-v4を実際に動かしてみます！
（ちなみに今執筆している裏で激重計算が走っておりファンがBGMを奏でています〜♪

### サンプルファイルをダウンロードする
pbrt-v4-scenesという公式のサンプルデータリポジトリがあるので、これをクローンします。

https://github.com/mmp/pbrt-v4-scenes/tree/master

まず、ターミナルを開いて、pbrt-v4をクローンしたのと、同じ階層に移動します。
今、pbrt-v4にいたとしたら、

```command:ターミナルで叩く：一個下の階層に移動する
$ cd ..
```
で移動できます。ここでpbrt-v4-scenesをクローンします。

```command:ターミナルで叩く：プロジェクトを自分の作業環境に複製する
$ git clone https://github.com/mmp/pbrt-v4-scenes.git
```

ここで、リポジトリのサイズが大きすぎて、クローンがエラーになることがあるようです。

```command:実際に生じたエラーの例
error: RPC failed; curl 18 transfer closed with outstanding read data remaining
error: 4498 bytes of body are still expected
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
```
ここからは、このエラーの根本的な解消をせずに場当たりの解決方法でサンプルを計算する方法で手順を記載します。
### ダウンロードするデータを最小限にして計算する方法
まず、好きなサンプルデータを選びます。私はbunny-furにしました。

https://github.com/mmp/pbrt-v4-scenes/tree/master/bunny-fur

選んだ種類のファイルを全部ダウンロードします。
ここで、GitHubは個別のフォルダごとにダウンロードできないので、一つひとつファイルをダウンロードして、GitHubと同じファイル構成を、pbrt-v4と同じ階層に作っていきます。
bunny-furの場合は、以下の画像のようなファイル構成になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689151/0a6c64c6-446f-4b40-44bf-99b4fa32a1ef.png)

これができたら、次にダウンロードしたデータを使って計算をしていきます！

### pbrtを動かす前にパスを通す
まず、pbrtをいつでも使えるように、「パスを通す」という作業をします。

設定ファイルを編集するために、以下のコマンドをターミナルで叩きます。
```
$ open ~/.zshrc
```
こうすると、.zshrcというファイルが開くと思います。このファイルの最後の行に、以下のコマンドを入力します。

入力する前に、「通したいPATH」の部分に、自分のPCでの設定を入力する必要があるため、pbrt-v4/buildのパスを取得する必要があります。

buildファイルを右クリックしてから、キーボードで```option```を押すと、「"build"のパス名をコピー」が出てくるので、それをクリックします。以下のコマンドで「通したいPATH」の文字列を消して、同じ場所にコピーしたbuildのパスを入力します。

```
export PATH=$PATH:通したいPATH
```

上記のコマンドを、ファイルの最後の行に入力して保存```command+S```します。

仕上げに、**ターミナルを消して、もう一回開き直す**と、全体に適用されます！
※これやらないと適用されないよ

### （やっと）pbrtを動かす

これで、```pbrt```コマンドが使えるようになったので、やっと実際に計算を始められます！

まず、先述でダウンロードしたサンプルデータの入ってるディレクトリ（フォルダ）に移動します。
私がダウンロードしたのは"bunny-fur"というディレクトリなので、以下のようなコマンドをターミナルで叩きます。

```command:ターミナルで叩く：サンプルデータの入ってるディレクトリ（フォルダ）に移動
$ cd bunny-fur
```
次に、pbrtを起動させます
```command:pbrtを起動
$ pbrt ./bunny-fur.pbrt
```

すると、以下のような文字列が出力されます。

```
pbrt version 4 (built NOW_DATE)
*** DEBUG BUILD ***
Copyright (c)1998-2021 Matt Pharr, Wenzel Jakob, and Greg Humphreys.
The source code to pbrt (but *not* the book contents) is covered by the Apache 2.0 License.
See the file LICENSE.txt for the conditions of the license.
```

これが出力されていて、エラーとかも書いてなかったら実行成功です👏👏👏

ただ、これしか出力されず、本当に大丈夫？と思ってしまうと思うので、ちゃんと動いているか確かめられるログも合わせて出力したいと思います。

上記のコマンドを実行している場合は、```control+C```で中断しましょう。
ログも一緒に出力するには、以下のコマンドをターミナルで叩きます。

```command:pbrtを起動
$ pbrt --log-file log.txt ./bunny-fur.pbrt
```

これで、リアルタイムにlog.txtにて以下のような計算経過を見ることができます！
```
~
[ tid 2793363 @     0.045s scene.cpp:765 ] Finished creating filter and film
[ tid 2793373 @     0.045s scene.cpp:769 ] Starting to create sampler
[ tid 2793376 @     0.045s scene.cpp:778 ] Starting to create camera
~
```

### レンダリング経過を見たいとき
なんと、自分が計算しているレンダリング経過を見られるそうです。
こちらのtevをインストールします。

https://github.com/Tom94/tev

```command:ターミナルで叩く：tevのインストール
$ brew install --cask tev
```
次に、tevのアプリケーションを起動します。finderを起動し、```command+shift+G```でパスから実行します。既存の入力されている文字を全部消して、以下のように入力します。
```
/application
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689151/f661c202-0d07-5baa-1324-998bca3a4358.png)

開いたアプリケーションのフォルダの中に"tev"があると思うので、右クリックで「開く」を押して起動してください。

```command:ターミナルで叩く：レンダリング経過を見ながら計算させる時
$ pbrt --display-server localhost:14158 ./bunny-fur.pbrt
```

これで、レンダリングが開始されると、以下のようにレンダリング経過をビューワーで見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3689151/ee745d66-1072-f476-43e5-50f507be8b0f.png)

### 他のオプションを使いたいとき

```command:ターミナルで叩く：他のオプションを使いたいとき
$ pbrt --help
```

でさまざまなオプションを確認することができます。基本文法は

```command:ターミナルで叩く：pbrtの基本文法
$ pbrt [<options>] <filename.pbrt...>
```
のようです。複数のオプションをつけることもできるので、私は上記で紹介したログとレンダリング経過のどちらもを出力したいときは

```command:ターミナルで叩く：例）ログとレンダリング経過のどちらもを出力したいとき
$ pbrt --log-file log.txt --display-server localhost:14158 ./bunny-fur.pbrt
```

のように使用します。

# まとめ

これで、サンプルデータを使ってレンダリング計算できるようになりました！
大変丁寧に教えてくれた彼氏に感謝しつつ、自力で色々できるようにお勉強頑張りたいと思いました！

ちなみに、MacではGPUが使えないからめっちゃ時間かかるらしいので、WindowsのGPU使える強いPCでやるのが良いらしいです！私はMacが好きだけどね！！