プログラミング超初心者のちなっちゃん(@toremolo_72)です
研究で物理ベースレンダリングをしたくて、Physically Based Rendering(https://pbrt.org/) を入門しました!
GitHubでPBRTのリポジトリも公開されており、使ってみよう!と思いましたが、初心者に優しい日本語の解説記事(作業環境:Mac)がなかったので、書いてみようと思いました。
プログラマの彼氏(@cha84rakanal)が頑張って解説してくれて使えるようになったので、覚書として記事にしてみます!
初心者が書くので当たり前やろ!と思っている内容まで書かれていると思いますが、後世の初心者レンダラーさんたちに有用な記事になりますように🙏
PBRTってそもそも何?
物理ベースレンダリングの名著です。現実だと分厚い辞書みたいな英語の本ですが、インターネットで無償公開されています。
光の反射とか拡散とかをできるだけリアルにシミュレーションしたい!と思った時の必読書になります。
※↓そもそも物理ベースレンダリングって何?という方はこちら
つぶやき)先日参加した学会Visual Computing2024の特別講演に著者のWenzel Jakobさん(この本だけじゃなくて、Mitsuba3とかも作ってるすごい人)が来ていて、すごー!!ってなってました。
実行環境
- 使用PC: MacBookPro
- チップ : Apple M1
- メモリ : 16GB
- macOS: Sonoma 14.5
PBRT-v4の使い方
ここからは、実際にPBRTを使えるように環境を作っていきます!
(懇切丁寧に日本語解説することを心がけます!)
環境を作ろう!
自分が作業したいファイルに移動する
まず、ターミナルを開いて、自分が作業したいファイルに移動します
$ cd 自分が移動したい先のファイル名
例えば、私だったら、"neko"というファイルの中に作業環境を作りたい!という場合は
$ cd neko/
という感じです。キーボードのTabでファイル名は補完されるので、"ne"を打ってからTabキーを押すと、"neko/"と自動で補完してくれます。
これができたら、ターミナルのコマンドラインの左側に、移動した先のファイル名が以下のように表示されます!
~@MacBook-Pro neko %
GitHubに公開されているpbrt-v4リポジトリをクローンする
次に、GitHubに公開されているpbrt-v4リポジトリ(https://github.com/mmp/pbrt-v4) をクローンします。
クローン:リモートリポジトリに保存されているプロジェクトのコードを、ローカルリポジトリに複製すること
この作業は、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 〜
の部分をコピペします。
$ git clone --recursive https://github.com/mmp/pbrt-v4.git
一般的に、クローンするときは git clone プロジェクトのURL
ですが、今回はpbrt-v4の作者さんたちだけでなく、GitHubに公開されている他のプロジェクトのリポジトリも使ってprbt-v4プロジェクトを作っているため、--recursive
というコマンドを途中にいれています。他のプロジェクトをクローンするときには必要ないこともあるので、READMEをちゃんと読んで、必要かどうかを判断します!
もし、--recursive
を忘れてクローンしちゃった場合は、以下のコマンドをターミナルで叩けば、連携している他のプロジェクトのプログラムコードもクローンできるので、安心してください!
$ 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ってなんだよ!って人が多いと思うので(私もそうだった)、どんなものかを超簡単に説明すると、
cmake:(c言語系で使える)たくさんのファイルを実行する順番とかをよしなにやってくれるようにする便利なシステム
という感じです(わかりやすさ重視のため厳密性に欠けるかもしれませんがご容赦ください🙏)
※↓こちら詳しく知りたい方はこの記事がおすすめです!!
本当だったら、たくさんのファイルをどうやって実行しようかな?とかどの順番でやればいいのかな?とか色々考えなきゃいけませんが、cmakeのおかげでとりあえず決まったコマンドを叩いておけば動いてくれる!という感じになります。ありがたいですね〜!
ということで、自分の作業環境でcmakeを使えるようにします!
まず、cmakeをインストールします。brewが入ってれば簡単にできます!
※↓Homebrewを入れるにはこちら
ここでは、brewが入っている前提で、以下のコマンドをターミナルで叩きます。
$ brew install cmake
以下の4つコマンドを無心になってターミナルで叩きます。
まず、クローンしたリポジトリに移動します。
$ cd pbrt-v4
次に、"build"ディレクトリを作成します。
$ mkdir build
buildディレクトリに移動します。
$ cd build
cmakeを起動します。起動の方法は2種類あります。
1つは、リリースビルドと呼ばれる、いわば製品レベルの実行です。このモデルを使いたいときは、以下のコマンドを叩きます。製品レベルということは、修正せずに使用できる=修正できることを想定されていない=デバッグしにくい、という性質があります。
$ cmake ..
これに対して、デバッグビルドと呼ばれる、開発レベルで実行できるモードを選ぶことができます。こちらは、リリースビルドとは違い、デバッグしやすいという性質があります。私は研究目的で用いるため、デバッグビルドを選びました。
$ cmake .. -DCMAKE_BUILD_TYPE=Debug
これで、以下の文字列が出力されたら準備完了です!
-- Configuring done (3.0s)
-- Generating done (0.7s)
実際に計算させてみよう!
ここからは、PBRT-v4を実際に動かしてみます!
(ちなみに今執筆している裏で激重計算が走っておりファンがBGMを奏でています〜♪
サンプルファイルをダウンロードする
pbrt-v4-scenesという公式のサンプルデータリポジトリがあるので、これをクローンします。
まず、ターミナルを開いて、pbrt-v4をクローンしたのと、同じ階層に移動します。
今、pbrt-v4にいたとしたら、
$ cd ..
で移動できます。ここでpbrt-v4-scenesをクローンします。
$ git clone https://github.com/mmp/pbrt-v4-scenes.git
ここで、リポジトリのサイズが大きすぎて、クローンがエラーになることがあるようです。
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にしました。
選んだ種類のファイルを全部ダウンロードします。
ここで、GitHubは個別のフォルダごとにダウンロードできないので、一つひとつファイルをダウンロードして、GitHubと同じファイル構成を、pbrt-v4と同じ階層に作っていきます。
bunny-furの場合は、以下の画像のようなファイル構成になります。
これができたら、次にダウンロードしたデータを使って計算をしていきます!
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"というディレクトリなので、以下のようなコマンドをターミナルで叩きます。
$ cd bunny-fur
次に、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
で中断しましょう。
ログも一緒に出力するには、以下のコマンドをターミナルで叩きます。
$ 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をインストールします。
$ brew install --cask tev
次に、tevのアプリケーションを起動します。finderを起動し、command+shift+G
でパスから実行します。既存の入力されている文字を全部消して、以下のように入力します。
/application
開いたアプリケーションのフォルダの中に"tev"があると思うので、右クリックで「開く」を押して起動してください。
$ pbrt --display-server localhost:14158 ./bunny-fur.pbrt
これで、レンダリングが開始されると、以下のようにレンダリング経過をビューワーで見ることができます。
他のオプションを使いたいとき
$ pbrt --help
でさまざまなオプションを確認することができます。基本文法は
$ pbrt [<options>] <filename.pbrt...>
のようです。複数のオプションをつけることもできるので、私は上記で紹介したログとレンダリング経過のどちらもを出力したいときは
$ pbrt --log-file log.txt --display-server localhost:14158 ./bunny-fur.pbrt
のように使用します。
まとめ
これで、サンプルデータを使ってレンダリング計算できるようになりました!
大変丁寧に教えてくれた彼氏に感謝しつつ、自力で色々できるようにお勉強頑張りたいと思いました!
ちなみに、MacではGPUが使えないからめっちゃ時間かかるらしいので、WindowsのGPU使える強いPCでやるのが良いらしいです!私はMacが好きだけどね!!