物理ベースレンダリング入門 その① - 物理ベースレンダリングとは?

物理ベースレンダリングに入門するための連載の第1回です。
今回は物理ベースレンダリングの概念とその背後にある考え方についてまとめます。

はじめに

この連載では物理ベースレンダリングに関する基礎的な知識をまとめていきます。

まずこの第1回目では物理ベースレンダリングの概念について説明します。
第2回では実装を行う上で用いる式を一通り紹介し、第3回ではUnityにおける実装を行います。

リアルタイムレンダリングを前提としているため、オフラインのパストレーシングなどの話題は取り扱いません。
また物理ベースレンダリングと銘打ってはいますが、シェーディングモデルを中心に解説していく予定です。

物理ベースレンダリングとは

さて物理ベースレンダリングとは、物理的な根拠に基づいてレンダリングを行う手法です。
英語表記はPhysically Based Renderingで、ここからPBRと略されたりもします。

物理ベースレンダリングよりも前から存在する古典的な手法としては、
LambertやBlinn-Phongなどのシェーディングモデルがあります。
これらを使うと以下のように物体を立体的に表現できます。

f:id:halya_11:20200228132059p:plain:w600
昔ながらのシェーディングモデルの例

ただ、これらの手法は実は「なんとなくそれらしく見えるように」計算式を組み立ててあるだけです。
そのためフォトリアルな絵作りをする場合にはアラが目立ちどこかリアリティに欠けた結果となりがちです。

そこで、物理ベースのシェーディングでは「可能な限り物理的な根拠に基づいて」計算式を組み立てます。
この「可能な限り物理的な根拠に基づいて」については次節以降で詳しく説明します。

ここにさらに、周囲の環境を映し込む間接光の影響を反映したり、
ポストエフェクトによる露光調整を行ったりすることでフォトリアルな結果を得られます。

f:id:halya_11:20200228132006p:plain:w600
物理ベースレンダリングの例

このようなレンダリング手法を物理ベースレンダリングと呼びます。

物体に入射する光の行方

さてここからは物体に入射する光の行方を追うことで物理ベースレンダリングの背後にある考え方を学びます。

まず物体に光が入射すると、光は反射成分と屈折成分に分かれます。

f:id:halya_11:20200228135446p:plain:w600
反射と屈折

エネルギー保存の法則

物理ベースレンダリングではここで、エネルギー保存の法則という物理法則を考えます。
エネルギー保存の法則とは、エネルギーの総量は常に一定であるという法則です。
すなわち、反射成分と屈折成分のエネルギーの総量は入射光のものと等しいということになります。

f:id:halya_11:20200228135920p:plain:w600
エネルギー保存の法則

物理ベースレンダリングでは、常に総エネルギー量が一定であるように設計をすることでエネルギー保存の法則を守ります。

フレネル反射

また、フレネル反射と呼ばれる物理現象についても考慮します。

フレネル反射とは、水面を真上から見た時には水中がよく見え、
反対に掠めるような角度から見た時には反射して水中が見えづらくなる現象です。
下の写真では下部ほど水中がよく見え、上部は景色の反射が強いことがわかります。

f:id:halya_11:20200228140603j:plain:w600
フレネル反射忍野八海

これは入射角が大きくなるにつれて反射成分が大きくなるという性質による現象で、
水やプラスチックなどの非金属において特に顕著にみられます。

f:id:halya_11:20200228142257p:plain:w600
フレネル反射の図

反射した光の行方

次に物体表面で反射した光の行方をより詳しく見ていきます。

f:id:halya_11:20200228142812p:plain:w600
反射光

このように物体表面で反射する光を鏡面反射光(Specular)と呼びます。

マイクロファセット

これをフォトリアルに見せるために重要なのが、マイクロファセット(微細表面)という考え方です。
一見平らに見える表面でも、顕微鏡で見ると細かい凹凸があったりします。

f:id:halya_11:20200228144012p:plain:w600
マイクロファセット

物理ベースレンダリングではこのような微細な表面をマイクロファセットと呼びます。

マイクロファセットによる凹凸が多いと、その凹凸により光は多方面に散乱します。  

f:id:halya_11:20200302203538p:plain:w600
多方面に散乱

その結果、反射はすりガラスとかマット加工されたアクセサリーのようなぼやけた感じになります。

f:id:halya_11:20200228144440p:plain:w600
細かい凹凸のある金属

反対に凹凸がなくツルツルだと鏡のようにくっきりとした反射になります。

f:id:halya_11:20200228144510p:plain:w600
ツルツルな金属

物理ベースレンダリングではこのような物体表面の粗さをラフネスというパラメータを用いて表します。

幾何減衰

また、マイクロファセットによる凹凸があると、反射した光の一部がその凹凸によりが遮蔽されます。

f:id:halya_11:20200228145813p:plain:w600
反射光の遮蔽

また入射時点でも同じようにマイクロファセットにより遮蔽されることが考えられます。

f:id:halya_11:20200228150052p:plain:w600
入射光の遮蔽

これらの現象により光が遮られるので反射する光は少なくなり、
結果として細かい凹凸があるほど物体の色は暗く見えます。

これを幾何減衰と呼びます。

屈折した光の行方

さて次に物体の中に屈折して入っていく光を追ってみます。

f:id:halya_11:20200228161407p:plain:w600
屈折して入っていく光

物体の中に入った光は物体内部の粒子に衝突し散乱を繰り返します。
また一部の波長が吸収されることで色が付きます。

f:id:halya_11:20200228161913p:plain:w600
散乱を繰り返しながら色付いていく

一部の光は散乱の結果、吸収されないまま物体表面から外に出てきます。
このような光を拡散反射光(Diffuse)と呼びます。

f:id:halya_11:20200228162515p:plain:w600
拡散反射光

サブサーフェイス・スキャタリング

このような拡散反射光の性質を考えると、物体の表層と深層で色が異なるような物質の場合、
光の通過した軌道によって吸収される波長が異なり色づき方が変わることが考えられます。
例えば皮膚の下に赤い血管がある人間の肌では、深いところを通った光ほど赤く色づきます。

f:id:halya_11:20200228163113p:plain:w600
肌の表面化散乱

このような現象はサブサーフェイス・スキャタリング(表面化散乱)と呼ばれます。

拡散反射の簡易モデル

このように、拡散反射光の働きは鏡面反射光に比べて複雑です。

実際にはこの計算はリアルタイムで行うには非常に重いため、
下図のように物体内部で反射した光が入射位置から出てくると考える簡易モデルを使うことも多いです。

f:id:halya_11:20200302202858p:plain:w600
拡散反射の簡易モデル

まとめ

以上、物理ベースレンダリングの概念とその背後にある考え方について簡単にまとめました。
物理ベースレンダリングでは、これらの考え方を式とソースコードに落とし込んでフォトリアルなレンダリングを実現します。

ただし実際には物質だけをとっても、蛍光特性を持つものや構造色を持つもの、異方性の反射をするもの、
自動車のクリアコート塗装のような特殊な層を持つものなどまだまだ考慮するべきことはたくさんあります。

また本記事では一方向からの入射光のみを考えていましたが、
現実には間接光が法線を中心とした半球上のあらゆる方向から注ぐことになります。
これを表現するためにはグローバル・イルミネーション(大域照明)の技術が必要になります。

さらに現実の光の輝度のレンジはディスプレイに表示できる輝度のレンジより大きいため、
HDR(ハイダイナミックレンジ)を扱えるパイプラインとポストエフェクトによるトーンマッピングを行う必要があります。

また物理的に正しく計算を行うため、リニアワークフローを用いることも重要です。

このように物理ベースレンダリングを語る上ではまだまだ説明しきれていないことが多いのですが、
本記事は入門編ということでこのあたりで締めくくりたいと思います。

その②では今回の内容を実際に計算するための計算式を紹介します。

連載一覧

light11.hatenadiary.com

light11.hatenadiary.com