shading model
今日はshading modelに付いて書こうと思っていた所,ちょうどsyoyoサンの所で興味深い記事がありましたので引用させて戴きます. lucille 開発日記: シェーダのインポータンスサンプリング BRDFやshading modelについては書く事が山ほどあるので何回かに分けて書くつもりですが,今日は実務からのshading model作りについて書きたいと思います. syoyoサンの記事では,importance sampingのために用いられる確率密度関数を,シェーダのコンパイル時にソースコードから自動抽出してしまおうという,何とも難しそうな事に挑戦されています.いやはや凄いですねえ… global illuminationを正確に計算させようとすると,そのシーンの中で起こる光の振る舞いまで,なるべく物理的な正確さに近づけなければなりません.即ち,物理的にあり得ない物質とか,とんでもない光源などは使われません. 特に重要なのはシェーダがエネルギー保存則を満たしている事です.つまり,あるシェーダに光源から1.0の入射があったとすると,その反射は1.0を超えてはいけません.1.0を超えるという事は,そのシェーダは光のエネルギーを新たに生み出している事になってしまい,レンダリング結果が正しくならないからです.(自己発光体は光源と考えます) では,我々のような制作者達は正しいシェーダを書いているのでしょうか.答えは否です.実際に使用されるシェーダは物理法則など何のその,エネルギーなど増えまくりです. もちろん,物理的な正確さを無意味だと言っている訳ではありません.正確さを追求する事は研究として非常に重要で意味のある事であり,これらの研究の成果から我々のような,もう少し応用分野の人間へ技術が下りてくるのですから,academicな方々には頭が下がるばかりです. 我々の書くようなシェーダは御想像の通り,絵作りを第一に考えてデザインされます.できるだけコントロールが利き,目的の結果に早く近づける事が命題です. これを実現しようとすると往々にして物理的な正確さは二の次になってしまい,本来のBRDFからどんどん改造されて行きます.physically basedなモデルにsecond specularやrim lightingが追加され,非線形なオペレーションを用い,果てはLambert modelでさえ良くある計算式とは違った物になります.ある意味既にLambert modelじゃ無いとも言えるかも知れません. このようなやり方(考え方)はGIを使う時でも同じですから,不正確さをある程度軽減するため,この部分はGIの計算で用いない,こっちは使う,というように人間が乱暴に決めて手で分けています.syoyoさんのレンダラでは,これを自動的かつ正確に生成できるようになるらしいですから,我々が書いたようなシェーダは恐らく使い物にならないでしょうね(笑). とは言え,photorealな物を作るためにはphysically basedなアプローチが強力な武器になる事もありますから,正確さを追求する事もあります.自分も経験があるので,これはまた別の機会に書きたいと思います.