物理ベースレンダリングの基礎理論
最近リアルタイムレンダリング界ではPBRに関する話題が熱いです。ただ、その定義の境界線はぼんやりとしていて「その正確な定義が何なのか」について混乱を招きがちです。その曖昧な定義をあえて短く説明するならば「状況により様々な意味がある」と私は答えます。この回答はさらに不満を生じさせそうなので、ここではPBRについて取り上げて「PBRとは何を表すのか」「他のレンダリング手法とどう違うのか」について軽く説明してみたいと思います。この説明はアーティストのような非エンジニアを対象にしているため、数式やコードは一切出さない予定です。「PBRと以前の手法とで何が異なるか」という質問は、ライトとサーフェースの性質(behavior)を掘り下げると大体解決します。その特徴的なシェーディング能力は、幾つかの旧来の近似方法やアート生成手段と比較して著しく進歩しています。よって、エンジニアだけでなくアーティストもこれらの変化の要因について理解しておく必要があるのではないかと思います。
まず何が進歩したのかを説明する前に、それらをよりよく理解するため幾つかの基礎理論について述べたいと思います。「既に基礎は抑えてるはずだ」という方にとっても理解をより深めるための価値はあると思うので、是非我慢して読んでいただきたいと思います。この基礎理論を読みきれば、Jowのチュートリアル記事"Tutorial: Physically Based Rendering, And You Can Too!"をよりチェックしたくなると思います。
拡散と反射
"diffusion(以下拡散)"と"reflection(以下反射)"は"diffuse"と"specular"としても知られています。これら2つの用語は、表面とライトの相互作用を分離した最も基本要素となります。大半の人は実用レベルではこれらの概念は理解していると思いますが、物理的にはそれらがどのように明確に異なるかは知らない方が多いと思います。光が表面の境界線に衝突すると"反射(reflect)"すなわち"跳ね返り(bounce off)"が起こります。反射方向は表面の法線の反対の方向になります。これはボールを床に投げつける時の現象ととても似ています。その場合も反対側の角度に跳ね返るので。ツルツルの表面上での症状は鏡と同じ現象になるでしょう。"鏡面反射性(specular)"という用語はこの鏡の現象を描写する時に良く使われて、ラテン語の"鏡"という意味から由来しています。
しかしながら、全ての光は表面から反射せず、通常一部は照明を当てられたオブジェクトの内部に浸透していきます。内部に浸透する光は、マテリアルに吸収されたり(通常熱に変換される)、内部で散乱したりします。この散乱光の一部は表面(入射した場所)とは別の場所から反射され、一回以上眼球やカメラの視界に入ってきます。これは、"拡散光", "拡散", "散乱光"といった多くの名前で知られていますが、全て同じ現象を表します。
画像::光の相互作用の基本要素(拡散と反射)
拡散光の吸収および散乱された要素は全く異なる光の波長であり、それぞれオブジェクトに光の色を与える要素になります。(もし1オブジェクトがほとんどの光を吸収してわずかに青色を散乱すると見た目は青になります)散乱要素は一様にカオス状態で全方向から同じ色に見えるとも言え(?)、鏡のケースとは全く異なります。この近似を使用するシェーダーは1入力として"アルベド(albedo)"を必要とします。これは、内部で散乱して表面の裏側から反射する様々なライト色の一部を表し(?)、時に同意語として"拡散色(diffuse color)"とも呼ばれます。
透光性と透明性
幾つかのケースで"拡散(diffusion)"はより複雑になります。例えば、肌やワックスといったより広い範囲で内部散乱するマテリアルを持つ場合です。これらのケースは単純色計算では成立せず、シェーディングシステムがライトに照らされたオブジェクトの形状や厚みを考慮に入れる必要があります。もしそのオブジェクトが十分薄ければ、散乱光がそのオブジェクトの裏側から見られて、translucent(半透明)と呼ばれる現象が起こります。もしグラス(glass)のように拡散要素が通常より低い場合はほとんどの要素が散乱しないのは明白で、全体像はオブジェクトの片方から反対側へ劣化することなく通過することができます。これらの性質は典型的な"表面に近接した(close to the surface)"拡散とは異なり、通常はそれらをシミュレートするためのユニークなシェーダーが必要になります。エネルギー保存則
これまでの記述で、我々は重要な結論を導く十分な情報を得てきました(?)。それは反射と拡散は相互に排他的であるということです。これは即ちライトが拡散してライトがまず表面で浸透しなければならないということを意味します(即ち、反射に失敗するということを意味します)。これはシェーディングの専門用語において"エネルギー保存則"の一例として知られていて、表面から放たれる光は本来感じる光よりも必ず明るい(→表面から放たれる光はそこに届いた光よりも強くなることはない)事を意味します。この法則はシェーディングシステムにおいて実行しやすいといわれてます。それは単純に拡散シェーディングを発生する前に反射光を減算するだけで実現できるからです(?)。これは反射率の高いオブジェクトは少量の拡散光を表示することを意味します?(show little to no diffuse light)。これは単に少量の拡散光に表面に光が浸透する事と同意でその結果ほとんどが反射することになります(?)。その逆もまた然りで、もしあるオブジェクトが明るく拡散する場合そのオブジェクトは著しく反射しにくくなるでしょう。
画像::アルベド一定下での反射性の変遷図
この種のエネルギー保存則は、物理ベースシェーディングの重要な側面の1つです。これはアーティストに(見た目が悪くなりがちな)物理法則のうっかり違反を防ぎ、マテリアル用の反射性とアルベドを用いた手法を提供します。コード内でこれらの制約を強要することは必ずしも良い見た目を生み出すとは限りませんが、これはある種の"過保護な物理学者(nanny physist)"として有益な役割を果たし、アートワークから物理法則を捻じ曲げたり、異なるライティング状況下で不安定な見た目になる事を防ぐことができます。
金属
ほとんどの金属が該当する"電気伝導マテリアル(electrically conductive materials)"は、以下の理由によりPBRにとって重要な要素となります。その理由を以下に述べます。まず「伝導体(金属)は絶縁体(非伝導体)よりもはるかに反射する傾向がある」点です。伝導体は通常高くて60~90%まで反射を行いますが、絶縁体は一般的にそれらより低く0~20%の間で反射します。これらの高反射性は内部からの散乱光が届くことを防ぎ、金属にとても"光沢ある(shinny)"見た目を与えます。
次に「伝導体の反射性は時々可視の(電磁波)スペクトルを通して変化しその結果それらの反射は淡い色を表す」という点。この反射色特性は伝導体内でも稀ですが、我々に馴染みのある幾つかの金属において発生します(例. 金、銅、黄銅等)。一般的に、絶縁体はこの効果を表さずそれらの反射は色がつかないという法則があります。
最後に「電気伝導体は通常表面に浸透する散乱光よりも吸収される」という理由です。これは伝導体理論において拡散光はいかなる兆候も見せないことを意味します。しかしながら実世界では、酸化物が存在し金属の表面の他の残余物が幾つかの少量の光を散乱させます。
この金属と他の物質(非金属)との間の二重性(duality)は幾つかのレンダリングシステムに"metalness"を直感的な入力として採用する事を可能にします。そのようなシステムにおいて、アーティストは金属属性を持つマテリアルに角度(degrees)を示すことで、従来のアルベドと反射特性を明確に示すよりも時にマテリアルを生成する上でよりシンプルな手段として好まれることがあります。しかし、これは必ずしも物理ベースレンダリングの特徴に必要であるわけではありません。
フレネル
"Argstin-Jean Fresnel"はかなり昔に亡くなった白人ですが、我々は恐らくその名を聞いたことがあるでしょう。なぜなら、彼はある重要な現象を明確に説明したため現象名に彼の名前が刻まれてるからです。彼のその発見が無ければ光の反射について議論することは現在でも難しかったことでしょう。コンピュータグラフィックスにおいて、フレネルという用語は「異なる角度で異なる反射が発生する事」を表します。具体的には"グレージング角度(grazing angles)"で表面に辿り着いた光はその表面上で消失する(dead-on)光よりも多く反射する傾向が強いといわれています。これは適切なフレネル効果でレンダリングされたオブジェクトはエッジ周辺でより明るく反射することを意味します。我々のほとんどはこの現象を実世界で経験していますし、コンピューターグラフィックスの世界でもその存在は新しいものではありません。しかしながら、PBR用シェーダーによってフレネル数式の計算における幾つかの重要な補正をより有名にしました。(ここではその重要な補正について説明します)
まず「全てのマテリアルにとって反射特性は"グレージング角度"において全て成り立つ」というものです。 これはいかなるスムーズなオブジェクト上に現れる"エッジ"は完璧な鏡のように見えるべきでそのマテリアル特性は影響しない事を表します。実際にいかなる物質でもその表面がスムーズでかつ正しい角度から見た場合は、完璧な鏡のように見えるはずです。これは直感で分かりにくいですが、物理的には正しい現象です。
二つ目のフレネル特性は「角度間のカーブあるいは勾配(gradient)はマテリアル毎に変化しない」というものです。金属はもっとも発散しますが、それらは分析的に説明可能です。
これは我々にとって「リアリズムを仮定することを求められていて、フレネル特性を用いる事でアーティスト制御コストは一般的に減少することあるいは最低限でも我々は既に各マテリアルのデフォルト値を知っていること」を意味しています!
これはある意味良いお知らせです。なぜならこの特性によりコンテンツ生成を単純化できるからです。このシェーディングシステムはフレネル現象を処理していて光沢(gloss)や反射性(reflectivity)といった既に存在する幾つかのマテリアル属性を処理(consult)できる唯一の手法です。
画像::クロムめっきした金属とゴムの基礎反射性
PBRワークフローは(上図に示した)"基礎反射性"(Base Reflectivity)"といった1つあるいは幾つかの手段によりアーティストに明白な仕様を与えます。これは最低限の光量?(the minimum amount)あるいは反射された光の色を提供します。いったんレンダリングされると、フレネル効果はアーティストが指定した値を反射性に加えるでしょう。そしてグレージング角度において100%(真っ白になる)まで加算されます。本質的にここで述べてる内容は基礎であり、フレネル数式はそこから引き継がれ、様々な必要な角度において表面をより反射するよう改良を続けています。
一つ重大な注意点がフレネル効果にはあります。それは「表面が滑らかでなくなればなくなるほど明確に素早くその現象は無くなっていく」という点です。この相互作用に関するより詳細な情報は後の項で述べたいと思います。
マイクロサーフェス
上述した反射性と拡散はいずれも表面の向きに依存します。大規模なスケール上ではこの表面の向き情報(?)はレンダリングされるメッシュ形状に依存します。そしてそのより細かな詳細なはノーマルマップによって表現されるかもしれません(?)。この表面の向き情報を持つことでいかなるレンダリングシステムも拡散や反射を極めて良い結果をもたらします。しかしながら、依然として大きな要素が一つ欠落しています。それは「現実世界のほとんどの表面がもつとても微細な不完全さ(very small imperfections)」です。具体例としては、適切な解像度のノーマルマップで表面すべきの微細な溝・ひび・目に見えるとても小さな集合体(lumps)等が挙げられます。これらのマイクロスコープ的特長は裸眼では見ることはできませんが、ライトの拡散と反射に影響しています。
画像::荒いマイクロサーフェス上の"ぼやけた"反射
極小表面(以下マイクロサーフェース)の詳細は反射において最も分かりやすい効果を得ます(物質の拡散はそれほど作用しないのでここではこれ以上述べません)。上図のように並行した入射光は粗い表面上では反射する際に各光線が様々な方向に分散します。現実世界でボールが断崖あるいは類似した凸凹した表面に衝突する際、ボールはさらに反射しようとしますが予測できない角度に反射する事でしょう。これと同様に、表面が凸凹しているほど反射光は多様な方向に拡散しその結果"ぼやけた"見た目になります。
残念ながら、シェーディングのために各マイクロサーフェスをまともに評価することはアートプロダクション・メモリ使用量・、計算量の観点から現実的ではないでしょう。我々はどうすればこのシェーディングを実現できるのでしょうか?もし我々がそのマイクロサーフェスの詳細は直接記述するアプローチではなく、"表面の粗さ(roughness)"の一般的な計測値を使用すればかなり正確なシェーダーを記述することが可能になります。この計測はよく"gloss", "smoothness"あるいは"roghness"と呼ばれていて、各マテリアルのこれらの計測値は1枚のテクスチャとしてあるいは固定値として格納することが可能です。
このマイクロサーフェースの詳細は各マテリアルの表現にとってとても重要な特徴となります。なぜなら現実世界は様々なマイクロサーフェスの特徴の集合体のようなものだからです。この"gloss mapping"というコンセプトは決して新しいものではありませんが、物理ベースのシェーディングにおいて極めて重要な役割を果たします。なぜならマイクロサーフェスの詳細は光の反射において大きな影響を持つからです。我々はまもなく実際に見ることになりますが、PBRシェーディングシステムを改良するためにはマイクロサーフェスの特性を幾つか考慮する必要があります。以下ではそれらの考慮すべき点について述べたいと思います。
エネルギー保存則(再び)
我々の仮説のシェーディングシステムは「マイクロサーフェスの細部を考慮し反射光が適切に拡散している」ので、反射する光の正確な量を考慮する必要があります。残念ながら、多くの他のレンダリングシステムはこの点については考慮できておらず、マイクロサーフェスの荒さ(roughness)に依存して反射する光が多すぎたり少なすぎたりする傾向にあります。その数式が適切にバランスがとられている時、レンダラーは荒いサーフェスをより多くの反射のハイライトを持つように描画します。言い換えると、スムーズな表面で見られるより小さなより鋭いハイライトよりもぼんやりと薄暗いハイライトを表します。この明るさを表現する上での明らかな相違はキーとなります。すなわち、各マテリアルは同じ量の光を反射するけれども、粗い表面であればあるほどより多様な方向に拡散し、スムーズな表面は一点集中した"光線"のように反射するという相違を抑えておくことは重要です。
画像::反射性一定下での光沢の変遷図
ここでは、先ほどとは違った切り口でエネルギー保存則を述べてみました。最初に述べた"拡散/反射のバランス"に加えて、"エネルギー保存則"はいかなるレンダラーにとって"物理ベース"を実現するために最も重要な要素の一つであることが分かっていただけたかと思います。
ようこそ!マイクロサーフェースの世界へ
ここでは、我々がここまで学んでてきた知識の中で重要な要素の1つである「マイクロサーフェスの光沢は直接的に反射の明るさ(brightness of reflections)に反映する」点についてさらに掘り下げたいと思います。これは「一人のアーティストがグロスマップに直接"引っかかれた・凹んだ・擦りむかれたあるいは磨かれた領域"等様々なバリエーションをペイントできる」ことを意味します。そして「PBRシステムは反射形状における変化だけでなく関連する明度(intensity)も描画されるでしょう。"spec mask"/反射性の変化("spec mask"/reflectivity changes)は要求されません(?)。これは非常に重要です。なぜなら、物理的に関連している二つの重要な現実世界の特性"マイクロサーフェスの細部"と"反射性"が"アートコンテント"と"レンダリングプロセス"において初めて適切に結びついているからです。これは以前に拡散/反射の綱渡り(balancing act)を述べたのと同様に我々は独立して双方の値をオーサリング可能です。しかしながらそれらは関連しているので、それらを全く別々のパラメータとして扱うことはかなり難しいと思われます。
さらに、現実世界のマテリアル計測は反射値が幅広く変化しないことが予想されます(詳細は上述した伝導性物質の項を読んでください)。一つの良い例として水と泥が上げられます。双方のマテリアルはとても似た反射特性を持っていますが、泥は非常に荒く水溜りの表面は非常にスムースなので、それらは反射光の観点からは非常に異なる見た目となります。PBRシステムにおいてそのようなシーンを作成する場合、アーティストはその異なりを反射特性を調整するよりも先にまずグロスマップやラフネスマップを通じてオーサリングする事になるでしょう。具体例として以下の画像を示します。
画像::マイクロサーフェスの例(水と泥)
マイクロサーフェスの特性は反射において同様に他の微細な効果も持ちます。例えば"境界線がより明るい"フレネル効果は粗い表面の場合幾分減少します。(粗い表面の混沌とした特徴はフレネル効果を"散乱"します。その結果、観察者にはフレネル効果が見えにくくなります?)さらに、窪んだマイクロサーフェスはライトを"だます"事が可能です。具体的には、表面に対して何度も反射することにより、光の吸収や明るさの現象を引き起こします。異なったレンダリングシステムはこれらの詳細を様々な方法で処理して様々な範囲に応用します。しかしながら、より粗い表面が薄暗く見える傾向は共通してます。
結論
当然ながら、ここでは述べていないPBRの重要なトピックはまだまだ数多くあります。このドキュメントは基礎的な紹介として重要なものを提供しただけに過ぎません。もしあなたがまだJoeの"PBRアートワークチュートリアル"を読んでいないのならば是非読んでみてください。更なる技術情報を求める方のために、いかに幾つかのお勧めの書籍およびウェブページを紹介しておきます。- John Hable's excellent blog post:Everything is Shinny
- John Habel's even better blog post:Everything has Fresnel
- Sebastien Lagarde's summary of Rendering Remember Me
- Come to think of it, all of Sebastien Lagarde's Blog is good stuff
- The Siggraph 2010 Cource on PBR
- Always worth mentioning: The Importance Of Being Linear
もし、それでもまだ答えが出ない熱い質問があれば、Twitter等で質問してみてください。
以上です。
>それは単純に拡散シェーディングを発生する前に反射光を減算するだけで実現できるからです(?)。これは反射率の高いオブジェクトは少量の拡散光>を表示することを意味します?(show little to no diffuse light)。これは単に少量の拡散光に表面に光が浸透する事と同意でその結果ほとんどが反射するこ>とになります(?)
返信削除元の光量 = 表面から放たれる光量 = (反射光量 + 拡散光量)
なので、
・拡散光量をもとめるには、元の光量から反射光量を引くだけでよいので簡単
・反射光量が多いオブジェクトは、拡散光量がほとんどない
ということだと思います。(原文読んでないですけど、よく訳されているので理解できました。)