【Computer Graphics】BRDFの始め方
BRDFを勉強してる @yamken_twi には俺の手グセが見えると思ったけどまだ見えなかったか…
— 落合陽一/Dr.YoichiOchiai (@ochyai) October 7, 2017
最近BRDFについて勉強を進めてきているのですが、より一層Computer Graphics(以下CG)界の人にご指導・ご鞭撻いただきたいと思っているので、自分の知識を整理してちゃんとアーカイブして分野に少しでも貢献していこうと勝手に思っています。
Computer Graphicsをどうやって勉強していったか
まずそもそもBRDFを勉強する以前にCG自体を勉強しないと話にならなかったです。
ただ、CGをまずやろう、となった時に大概OpenGLから話が始まったりします。 床井先生の資料はよく出てきますし、わかりやすいです。
でも、僕がまず知りたいのはCGの概論・理論的なところの土台をしっかりとしたいわけです。 Viewとかの話をいきなり実装ベースで語られる前に、全体的な概要を掴みたいわけです。
そこでまず使ったのがこちら。
筑波大学のCG関係の授業でもよく出てくる本です。 CGに全く触れたことがなくて、初心者の状態からでも入りやすい本になっています。 一から全て書いてくれてるので、まず一冊読むとCGの世界観がわかってきます(そこそこ新しい手法も載っています)。
そして、ここからもう少し詳細な話を聞きたいとなると、こちらのリンク先にある資料が役に立ちます。
MIT Open Lectureの資料がズラーっと並んでいます。 もちろん最初の本と被っている部分も多いですが、一歩深い話にまで踏み込んでいます。 これを読むことで、より理解が進むのは間違いありません。
この2つが分野全体を網羅しながら勉強できる参考資料となっていて、そこに補足する形でいくつかのサイトや資料を紹介します。
『THE COMPREHENSIVE PBR GUIDE Volume 1: The Theory of PBR by Allegorithmic』私家訳版
『THE COMPREHENSIVE PBR GUIDE – Vol. 2: Practical guidelines for creating PBR textures 』私家訳版
最新の手法やTipsの話をせずともこれだけの資料が出て来るわけです。 Computer Graphicsの分野がいかに広範なものか理解できると思います。 ちなみに今回は入門に近い分野のみを扱うので、最新の話はしません。
BRDFとは何か
さて、前章であげた資料を読んでいただいた暁には、Computer Graphicsについて基礎的な理解が進んだことでしょう。 次に、BRDFとは何か、という話をしていきたいのですが、これは色んなリンク先を読んでいくことで徐々にわかっていくことだと思います。 一応、僕の方でも書きますが、併記するリンク先を色々と読んでいくことが重要です。
BRDF = Bidirectional Reflectance Distribution Function
日本語でいうと双方向反射率分布関数
この日本語に全てが詰まっています 「双方向」であり「反射率」の「分布関数」なのです。
「双方向」であるというのは?
光を物体に当てると反射・屈折・透過をします。 そのうち特に反射がここでは重要で、入射光があれば反射光があります。 この2つを入れ替えても同じになる、というのが「双方向」の意味です。
「反射率」の「分布関数」とは?
入射光を反射する時、
- 鏡面反射
- 拡散反射
が主な要素ですが、特にこれらの反射がどのような向きに向かってどれくらいの強さで、何色を反射するかというのを分布関数として表現するということです。
向きをあらゆる方向で取らなければいけないのは、ザラザラな表面であればあらゆる角度に光が拡散するのは想像のつきやすい話で、拡散反射の話です。 そして、強さというのは、物体表面でどれくらい光が吸収されるかという話とつながります。 更に、色というのは、黒の物体や赤の物体のように、物体は波長ごとに吸収率が違うことからもわかるように、反射する色(波長)も物体によって変わります。 なので、反射率を波長ごとに求めるような(モデル化するような)場合もあるのです。
これらBRDFを理解するのに役立つリンク集
僕はイラストを描くのは苦手なので、図解入りの説明はリンク先に任せます。
BRDFで外せない論文たち
おそらくReflectance Mapに関する最初の論文がこれです。 Calculating the reflectance map (1979)
A Data-Driven Reflectance Model (2003)
それと、Phongモデルの理解は必須です。 これは論文を読むまで行かなくても、wikipedia等でめちゃくちゃ基礎となる方程式の理解くらいはしておく必要があります。 Phongの反射モデル
An Overview of BRDF Models (2012) これはBRDFのモデルに関して、2012年時点であらゆることをまとめてくれています。
モデルはこのOverviewにたくさん載っていて、更にそれぞれのモデルがどれくらいの近似をできるかというのを調べた論文もあったりします。 Fitting analytical BRDF models to low-resolution measurements of light scattered from relief printing samples (2016)
MERL BRDFについて
さて、BRDFの理論がどんなものかわかってきたところで、実際に値をどうやって使うことができるかを考えていきます。
そもそもBRDFのモデルというのは、現実世界の値への近似です。 Fitting Analytical...の論文なんかは、モデル化したものと実際の測定値の値の差分(Err)を最適化(最小化)する論文なわけですが、それをするためにはBRDFの実際の測定値が必須です。
で、その測定って自分でやるのか、という話ですが、機材を買ったりどこかに外注すれば測れるかもしれませんが、普通、それ用の機械とか持っていません。 そこで、過去に計測してくれたデータベースのデータを利用するのが吉です。 MERL BRDF Database
100種類のMaterialに関して、それぞれのBRDF値が記録されているデータベースとなっています。
http://people.csail.mit.edu/wojciech/BRDFDatabase/code/ に BRDFRead.cpp というファイルがあり、これをコンパイルして実行することで、binaryデータとして保存されている反射率の値の読み込みができるようになります。
ちなみに、
というコードがあるように、入射光と視点方向のベクトルをそれぞれ用意し、値を少しずつ変化させて行くことで反射の分布の値をそれぞれ取ることができます。 そして、red, green, blueの値がそれぞれあるように、モデルにもよりますが、RGBそれぞれの反射率を分けたり、波長ごとに反射率を分けたり、場合によってはRGBに全て同じ反射率を適応することがあります。
元のコードのままでは読み込み&コンソールへの出力まではできますが、textファイルなどへの保存はできないので、そこら辺は自分でやる必要があります。
BRDFLab
MERL BRDF DatabaseはBRDFに関する論文で引用されることはめちゃくちゃ多く、ここのbinaryデータを利用している論文は数多いのですが、その中でも簡単に試せるソフトウェアを提供してくれている人がいます。
そのソフトウェアがBRDFLabです。
GPUが搭載されているWindows PCに限定されてしまうのが制約条件ですが、シンプルに使いやすいです。
File > New > Measured
から、MERL BRDF Databaseのbinaryファイルを選択して読み込ませることもでき、反射率分布の様子を見ることができます。
ただし、Environment Mapを利用したレンダリングには適用できないようなので、Environment Mapを適用した時のレンダリングを見たい場合は、既に用意されているXMLから読み込んで見る必要があります。
もしくは、pbrt-v3を利用する手もあります(これは別の機会に紹介します)。
最後に
簡単にComuter Graphicsの始め方からBRDFの入門のところまで触れてきました。
ただこれは、あくまでも入門編に過ぎません。
次回以降、もうちょっと詳しく、最新論文のことにも触れながら進めていきたいと思います。