物理ベースレンダリング(PBR)の基本



原文 http://www.marmoset.co/toolbag/learn/pbr-theory

物理ベースレンダリング(PBR, Physically-based rendering)は最新リアルタイムレンダリングのトレンドと言えるほど話題になっています。でもPBRの定義と範囲に関しては異論が多いです。それ で私は既存の古いレンダリング方法と比べてPBRとは何なのか説明してみようと思います。この文書は非エンジニア(主にデザイナ)を対象にしているので数 学とコードは無しにします。

物理ベースシェーディングシステムを既存のシステムと差別化させる多くのものは光と表面の作用に関する細かい理 論です。ハードウェアのスペックは古い近似計算と方式を放棄してもいいほど進歩しました。これはエンジニアとデザイナに、何が進歩したかを理解する必要が あることを意味します。

新しいことを始める前に基本的なことからきちんと定義していきます。もう知っていると思っても精読する意味があると思います。

拡散(Diffusion )&反射(Reflection)

拡散光(diffuse), 反射光(specular)とも表現される、拡散と反射は表面と光の作用を表す最も基本的な区別です。ほとんどの人達はこの考え方に関して実用レベルで馴染んでいますが、物理的にどう区別するのかに関してはあんまり知らない場合もあります。

光は表面にぶつかると一部は反対側に反射します。この作用はボールを地面か壁に投げると反対側に跳ね返るのと似ています。このような原理で滑らかな表面は鏡 のように見えます。この効果を表現する単語「反射(specular)」はラテン語の「mirror」から由来します。

でもすべての光が表 面で反射するわけではありません。普通一部は光を受ける対象の中に浸透します。材質(マテリアル)により吸収(普通熱に変換される)されるか内部で散乱し ます。散乱した光の一部は表面外に戻って目かカメラで見れるようになります。この現象は拡散光、拡散、表面下​​散乱など色んな名前を持ちますが、全部同 じことを言っています。


拡散光の吸収と散乱は、物体の色を決める(例え他は吸収して青を散乱すると青にみえる)光の波長によって結構変わります。散乱は鏡と違って方向に関係なく決 まった分だけ(確率的に)起こるので、どこから見ても同じ色に見えます。シェーダーでは一つの入力として「アルベド(albedo)」を使って表面下​​ 散乱を近似して表現できます。同じ意味で拡散色(diffuse color)とも言えます。

透過(Translucency) & 透明(Transparency)

拡散の処理で皮膚やワックスのように散乱距離が長いマテリアルの場合、複雑になります。こういうケースでは単純な色ではなく光を受ける物体の形や太さを シェーディングシステムに取り込まないと駄目です。物体が十分薄い場合、反対側で光の散乱が見れます。これは透過と言えます。拡散がガラスのようにもっと 低い場合、散乱が殆ど起こらないので後ろのイメージがまんまと通って見れます。このような作用は典型的な表面の処理とは完全に違うので、シミュレーション するためには一般的に独自のシェーダーが必要です。

エナジー保存(Energy Conservation)

ここまでの説明で反射と拡散はお互い排他的という結論が得られます。光が拡散されるときは表面に浸透(浸透に失敗した場合は反射)するからです。シェーディング用語としての「エナジー保存」は表面から反射される光の量はその表面を照らす光の量より少ないことを意味します。

シェーディングシステムでこれを強制するのは簡単です。一から反射された分を引いた後、残りの分拡散シェーディング(diffuse shading)を行うことです。これは非常に反射率が高い物体の場合、殆どの光を反射してしまったので浸透する光が少なくなり拡散も少なくなるというこ とです。その逆も同じです。明るく拡散している物体は反射率が低くなります。

このようにエナジー保存は物理ベースシェーディングで重要です。アーティストがアルベドと反射率でマテリアルを設定する際に、物理法則に反する(見難くなる 可能性が高い)設定をすることから守ってくれる指針になります。これらをコードで制約することはいい結果のため必須とは言えませんが、多様な照明環境下で ルールから外れすぎることを除いてはくれるはずです。

金属(Metals)

導電体、特に金属に関しては幾つかの理由があるのでこのタイミングで言及しておきます。

第一、導電体は絶縁体(非導電体)よりすごく反射率が高いです。導電体は普通反射率が60%~90%で高いですが、絶縁体は0%~20%で低いです。このような高い反射率が光が内部に到達したり散乱するのを除くので金属は明るく見えます。

第二、導電体の反射は可視スペクトラムの違いで時には色が付いている場合があります。この現象は導電体の中でも珍しいことですが日常生活で接するマテリアル(金、銅、黄銅など)でも見れるものです。一般的に絶縁体ではこの効果がないので反射は無色になります。

最後に導電体は表面に浸透して散乱するより吸収する傾向があります。これは理論上導電体では拡散光が見れないことを意味します。でも現実では酸化または金属表面の若干の不純物により少量の光が散乱します。

金属とそれ以外のマテリアルを分ける金属性(metalness)というパラメータを直接入力として導入したレンダリングシステムもあります。そのようなシ ステムではアーティストはアルベド(albedo)と反射率(reflectivity)を明示的に指定する代わりに、金属に近いかの度合いを指定しま す。これはマテリアル生成の簡単な方法として好まれる場合もありますが物理ベースレンダリングに必要な特性ではありません。

フレネル(Fresnel)

フレネルは色んな現象に関して、初めて正確な描写をした人として名前を残しています。光の反射に関して論議する際にも彼の名前なしでは難しいです。

コンピューターグラフィックスでの「フレネル」は角度による反射率の違いを意味する単語です。特に正面から表面に到達する光より掠る角度(glancing angle)の光の方が反射しやすくなります。これは適切なフレネル効果が適用された物体の描画では境界線近いが明るくなることを意味します。私達はこう いう効果に慣れているし、コンピューターグラフィックスにとっても新しいことではありません。でもPBRシェーダーはフレネル方程式の展開で幾つかの重要 な修正を行います。

第一、すべてのマテリアルで反射率は掠る角度で最大になるので、滑らかな物体なら材質に関係なく境界線部は完璧な(無色 の)鏡のようになります。本当にどんな材質でも表面が滑らかで正しい角度から見れば鏡になるます!反論の余地はありますが、この(物理学的)仕組みは明瞭 です。

第二、角度によるフレネル効果の推移は緩慢なカーブになり、マテリアル間の差は大きくありません。 金属が一番逸れていますが、計算範囲内です。

この結果はリアリズムを目指す場合、アーティストは一般的にフレネルを増やすのではなく減らすべきということを意味します。少なくとも基本値をどこに合わせるべきか私達は分かるようになりました。

良いニュースとしてフレネル効果は簡単に設定できるということです。最近のシェーディングシステムはフレネル効果の処理を完全に管理してくれるので既存の光沢(gloss)や反射率(reflectivity)のようにマテリアル属性の一つとして扱うことができます。

PBR 作業過程(workflow)中、アーティストは一つ以上の方法で「基本反射率」を指定します。この数値で光が反射する最小量と色が決まります。フレネル 効果はアーティストが設定した数値の上に掠る角度(glancing angle)で100%までの反射率を足します。基本的に描画されたものをベースにフレネル効果が起こり、角度によって表面の反射率が上がることになります。

フレネル効果には注意点があります。それは表面が滑らかではない場合、急激に現れなくなるということです。これに関する説明は後にします。

微細表面(Microsurface)

今までの反射と拡散に関する説明は表面の状態に依存します。大きいスケールだと描画される物体の形が、詳細な描画にはノーマルマップが使われます。普通レン ダリングシステムはこういう情報で結構いいレベルで拡散(diffuse)と反射(reflection)を描画できます。

でもこれではまだ足りない部分があります。実世界の大体の表面は完全ではなく目に見えない激細かい溝、ひび、しこりが付いていて普通のノーマルマップで表現するのは難しいです。裸眼で見れないにもかかわらず、こういう激細かい特性は光の拡散と反射に影響を与えます。

微細表面の影響が一番出るのは反射(表面下​​散乱(subsurface diffusion)は大きい影響を受けないのでここでは論外にします)です。上記の図で平行した光が粗い表面に当たって別々の方向に反射することがわか ります。ボールと壁の例だと崖に投げて予想不可の方向に跳ね返るのと似ています。簡単に言うと表面が粗くなると反射する光は発散する、または「ぼやける」 ように見えます。

不幸なことにシェーディングで微細表面の特性を再現するのはメモリ量、計算量の側面で費用が高すぎです。じゃどうすればい いでしょうか。微細表面を直接再現するのを諦める代わりに凹凸(roughness)の尺度を設定することで、近い結果を得られる精度の高いシェーダーを 書くことができます。この尺度は普通グロス(gloss)、滑らかさ(smoothness)、または凹凸(roughness)と言えるものです。尺度 を入力する方法はテクスチャを使うかマテリアル別に決まった数値でもいいです。

実世界は微細表面の特徴で溢れているので、どんなマテリアル でも微細表面の情報はとっても重要な特性です。グロスマッピンッグ(gloss mapping)は新しい概念ではありませんが、物理ベースシェーディングでは重心的な役割をします。微細表面の情報は光の反射に大きい影響を与えるから です。次は微細表面の情報がPBRシェーディングシステムの改善とどう関係するのか考察します。

エナジー保存(もう一度)

シェーディングシステムに微細表面の情報を取り組んで反射光を適切に散乱させる場合、反射する光の量には注意しなくてはなりません。残念なことに数々の古いレンダリングシステムではこれを誤ち、微細表面の粗さに対して光を反射しすぎるか反射しなさすぎたのです。

方程式が適切にバランスを取っている場合、粗い表面は大きくて浅ぐろい反射ハイライトを、滑らかな表面では小さくて鋭いハイライトを描画することになりま す。明るさの明確な違いがキーです。両マテリアルが反射する光の量は同じですが、粗い表面は色んな方向に散乱させている反面、滑らかな表面はもっと集中し た「ビーム」として反射しています。

前述の拡散と反射のバランスに関する説明に加えて、これが私達が守るべきエナジー保存の2番目の法則です。この法則を正しく処理するのが、「物理ベース」を目指すレンダラーには重要なポイントです。

微細表面バンザイ(All Hail Microsurface)

今までの知識を通じてわかったことは実際一つです。微細表面の艶は反射の明るさに直接影響を与えるということです。これはアーティストがグロスマップ (gloss map)上に直接傷、凹み、摩耗、擦り切れ部分などなんでも描き込んだら、PBRシステムは反射の形だけではなく強度も一緒に合わせてくれるはずです。ス ペキュラーマスク(specular mask)/反射率をいじる必要はありません!

微細表面状態と反射率は物理的に関連しているので、芸術的側面(art content)でも、技術的側面(rendering process)でも最初からこれらを正しく結びつけることは重要です。 これは前述で説明した拡散/反射のバランス仕組みと同じです。この両数値を個別に設定することもできますが、お互い連動する関係なので分けて扱うのは作業を難しくするだけです。

また、実世界のマテリアルを観察してみると反射率は(導電体の説明でわかったように)そこまで変わるものではありません。良い例として水と泥があります。両 方反射率はほぼ同じですが、泥の表面は結構粗くて水溜りの表面は滑らかいので反射という側面で見ると見た目は結構差があります。アーティストがPBRシス テムでこのようなシーンを作るとしたら下のイメージのように、反射率ではなく主にグロス(or roughness)マップを通じて調整します。

微 細表面の特性は反射に置いて付加的な効果もあります。例えば粗い表面では、「境界部分では明るくなる」フレネル効果が(粗い表面の不規則的な特性でフレネ ル効果が散乱し、見る人に綺麗に届かなくなるため)減ります。また、大きいor凹面の微細表面は光を囲む特性があり、表面で反射を繰り返すので吸収が増 え、明るさが減ります。色んなレンダリングシステムは多様な方法でこういう表現を扱っていますが、粗い表面を浅ぐろく表現する傾向があるのは同じです。

結論

物理ベースレンダリングに関して言いたいことはもっといっぱいありますが、この文書では基本的な紹介に留まることにしました。まだ読んでいなかったらJoe Wilsonさんのチュートリアルcreating PBR artworkをおすすめします。もっと技術的な情報が欲しい場合は下記のリンクをおすすめします。
Always worth mentioning: The Importance of Being Linear


外国語を外国語に翻訳したので、間違えたり変な文章になっている部分があると思います。勉強になりますので連絡して頂ければ幸いです。

0 コメント:

コメントを投稿