読者です 読者をやめる 読者になる 読者になる

穴日記

どうだ明るくなったろう

レイトレ本書評10連発

このポストはレイトレ合宿2アドベントカレンダーの10回目です。

 

皆さん、レイとばしてますか?なんと残り時間も12日というわずかなものになってきました。あれほど沢山時間はあったのに、いったいどこへ消えてしまったのでしょうか?それは誰にもわかりません。

さて、今から本を読んだってもう遅いかもしれません。しかし、例え合宿が終わっても日々は続いていき、レイは飛び、CGはレンダリングされるのです。今回の合宿で得た経験を生かし、さらなる飛躍を遂げるためにも温故知新、過去の知に触れることは重要なことです。そこで、今回は独断と偏見で選びだした10冊のレイトレ(関係)本について書評を加えていきたいと思います。これからレイトレの本をいっちょ買おうと思っている人の参考になればと思います。

 

CG Magic:レンダリング
CG Magic:レンダリング

CG Magic:レンダリング

 

 一冊目はCG Magicです。この本は倉地さんという長年CG業界でテクニカルなライターをされていた方が書かれた本です。日本のレイトレ本業界は惨憺たる有様であり、レイを飛ばしてるだけ、それも業界の主流の手法は無視、みたいな感じなのですが、この本は基本的にアカデミックなCG業界における手法をきちんと押さえてある「日本語の」書籍です。

扱っている内容も、基本的なRadiometryの話からレンダリング方程式、GPU、ボリュームレンダリング、表面化散乱といった幅広い内容に触れています。また、イメージベースレンダリングHDRに関するあれこれ、さらにはBRDFの測定やPrecomputed Radiance Trasnferにまで話は及んでいます。

あくまでサーベイ的内容なので個々の手法を詳しく知るにはさらに各文献を当たる必要がありますが、レイトレをはじめレンダリングに関する諸技法の概略をつかむにはかなり良い本だといえます。日本語なので英語はちょっと・・・という人にもぴったりです。

フォトンマッピング
フォトンマッピング―実写に迫るコンピュータグラフィックス

フォトンマッピング―実写に迫るコンピュータグラフィックス

 

 これも日本語の本です。青本とか呼ばれてるとかいないとか。いわゆるグローバルイルミネーションも含んだまっとうな物理ベースレンダリングについて書かれた本で、フォトンマッピングの開発者であるJensen先生の書かれたフォトンマッピングの解説書です。

Jensen先生が書かれただけのことはあり、内容は非常に充実しています。これさえあればフォトンマッピングの実装はまったく容易なものになるでしょう。巻末にはコードまで付属しています。この本を読んでフォトンマッピングを実装したという日本の人はとても多いようです。一方、フォトンマッピング本であるが故にフォトンマッピング以外のレンダリング手法、たとえばパストレーシングや双方向パストレーシング、メトロポリスライトトランスポートといった手法については軽く触れる程度でほとんど解説らしい解説はなく、他の文献を当たる必要があるかもしれません。また、BVHのようなレイトレの加速構造をはじめ、「レンダラを書く」という点のサポートはあまりありません。

出たのが2002年ということで近年のフォトンマッピング系手法の進化には対応できていませんが、それでも基礎中の基礎であるオリジナルの手法を学ぶのには非常に役に立つと思います。日本語で書かれたグローバルイルミネーションアルゴリズムの本としての価値も高いと言えます。

Ray Tracing from the Ground Up
Ray Tracing from the Ground Up

Ray Tracing from the Ground Up

 

 続きまして金魚鉢の本で、英語の本です。レイトレーシングによるレンダラに関する解説を、一章につき一つトピックをとりあげてソースコードを交えて行う、という趣旨の本になっていて、幅広いトピックを扱っています。

アンチエイリアスからサンプリングの方法、DoFから光の物理、アンビエントオクルージョン、エリアライト、空間分割、グローバルイルミネーション、プロシージャルテクスチャなどなど、思いつくことは全部入れました、という感じです。

レンダラの設計やトピックの選定を始め、どうも(後で取り上げる)"Physically Based Rendering"を平易にしたバージョンという印象があります。レイトレはじめたばっかりで、ちょっと進んだテクニックや知識を得たい!という人には非常におすすめの一冊です。コードと解説が近いのがうれしいですね。また、近いうちに第二版が出るそうです。

Advanced Global Illumination
Advanced Global Illumination, Second Edition

Advanced Global Illumination, Second Edition

 

 名前の通り、グローバルイルミネーションに関する先進的なアルゴリズムを取り上げた本・・・かと思いきや前半は非常に丁寧にグローバルイルミネーションの原理、理論や方法論を解説してある本です。後半は最先端のグローバルイルミネーションアルゴリズムの解説、ということになっています。

とにかく前半部の価値が非常に高い本です。レイトレ本は世の中にたくさんありますが、Radiometryやレンダリング方程式のような基礎中の基礎、みたいなことについて細かく詳しく分かりやすく解説されている本は案外少ないものです。この本は、この点については非常に優れており、私もレイを飛ばし始めたころは貪るように読んだものです。練習問題なんかもついているので解いてみると良い勉強になります。一方、後半部は最先端といいつつやや昔の本であるがゆえに今となっては若干古くなってしまっている部分も否めないでしょう。(それでも有用度は高いですが)

少し進んだ物理的なレンダリングの基礎をやりたい人向けですね。

Realistic Ray Tracing
Realistic Ray Tracing, Second Edition

Realistic Ray Tracing, Second Edition

 

 基本的にRay Tracing from Ground Upと同じような感じの本です。レンダラのコード解説を、一章につき一トピックくらいの感じでおこなっていきます。この本はBounding Volume Hierarchyについても触れてるのでそこだけ違いますが、まあGround Upを買っておけば間違いないんじゃないかという気もします。ページ数はこっちの方が少ないので、とにかく素早くいろんなことを知りたい!というときはこっちを買って一気に読むと結構知識が増えると思います。

Physically Based Rendering: From Theory to Implementation
Physically Based Rendering, Second Edition: From Theory To Implementation

Physically Based Rendering, Second Edition: From Theory To Implementation

 

 出ました。超有名なレイトレ本、通称PBR本です。PBRTとかも呼ばれてます(PBRTはこの本とセットのレンダラの方であるという説もあります)。日本でもこの本だけは知っている人が多かったりしますね。

しかし、この本は1000ページ以上ある長大なもので、カジュアルに「ちょっとレイでも飛ばしてみっか~」という人間が買ってもどうしようもない可能性があります。この本もレンダラのソースコードを部分ごとに取り出して各トピックごとに解説を加えていく、というものですが、とにかく扱っている範囲・量が膨大なのでまったくの初心者がいきなりこの本を開いても全部読み終わるまでレンダラを作れない!ということになりかねません。

もちろん、「俺は1000ページくらい楽勝で読んで、レンダラを作ってやるぜ!」という意気込みの方は問題ありませんが、そうでもなければこの本「だけ」に頼ってレンダラを書くのは結構大変だと思います。

扱っている内容、量、質はまったく申し分なく、ありとあらゆるレイトレーシング・レンダラに関するテクニック・技術・理論が詰まっている非常に優れた本です。私もことあるごとに開いています。しかし、とりあえずレイトレ書いて絵を出したい!みたいな人は上で紹介したようなもう少しカジュアルな本を使いつつ、補助的にこの本を使う、という作戦が一番いいんじゃないかと思います。1000ページって結構多いよ。

 Computer Graphics: Principles and Practice
Computer Graphics: Principles and Practice (3rd Edition)

Computer Graphics: Principles and Practice (3rd Edition)

  • 作者: John F. Hughes,Andries van Dam,Morgan McGuire,David F. Sklar,James D. Foley,Steven K. Feiner,Kurt Akeley
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2012/12/28
  • メディア: ハードカバー
  • クリック: 1回
  • この商品を含むブログを見る
 

 これもかなり有名な本ですね。こちらはレイトレ本というよりかコンピュータグラフィックス全般について取り扱った本です。豊富なソースコードと実例に基づき、フルカラーの解説が非常にありがたい内容になっています。

カバーしている範囲は、単純なラスタライズみたいな話からジオメトリや信号処理、シェーディングから色彩に関する話など、コンピュータグラフィックスについてのあらゆる話、といった感じです。特にジオメトリにかんしては、専門書はどれもかなり難しくなるためこういう基礎についてちゃんと扱った本はかなり便利です。

レイトレについてももちろんカバーしており、パストレーシングやフォトンマッピングの実装に関する示唆を与えてくれます。ただし、あくまでCGの教科書的な本でありレイトレ専門の本ではないためやや物足りないと感じる人もいるかもしれません。

Production Rendering
Production Rendering: Design and Implementation

Production Rendering: Design and Implementation

 

 この本は名前の通り、プロダクション向けのレンダラについての本です。プロダクション向けのレンダラは、研究で作るレンダラや個人で作るレンダラとは違います。そこにはプロダクションのための、泥臭い機能や強く実用的な機能が多分に盛り込まれていきます。(わりとRenderMan系です)

扱っている範囲は、全体のアーキテクチャから、ジオメトリ、シェーディング、シェーダのコンパイラ設計、レイトレーシングに関するあれこれ、グローバルイルミネーション、画像のリコンストラクション、その他あらゆる実用的なテクニックなどなどです。

グローバルイルミネーションひとつとっても、イラディアンスキャッシュのような実用度の高い手法が取り上げられていますし、実用的なテクニックに至ってはpowやlogの高速化にまで話がいたります。

結局、プロダクションという出口がレイトレには必要だという側面もあります。こういう本を買ってみてプロダクションではどのようなレンダラが設計されているかに触れてみるの面白いかもしれません。

 色彩工学
色彩工学

色彩工学

 

 ここからはレイトレとは直接関係ないながらも、非常に重要な知識を与えてくれる本の紹介です。まず、色彩工学についての本です。

色彩工学とは、人間の色の知覚を工学的に取り扱う分野です。色の知覚は本来個人差が強い極めて心理的な要素ですが、しかしながら色というのは普遍的に溢れており工学的に取り扱う必要があります。色彩工学はこのような問題を解決するための学問であり、この本を読めば、我々が普段漠然とRGB値~とか言って取り扱っているものにも全て工学的背景が存在するということがわかることでしょう。

物理ベースのレイトレも、つまるところ光の物理シミュレーションなわけで、最終的な画像にする際には色彩工学の知識が大いに役に立つでしょう。

 ヘクト光学1
ヘクト光学1 基礎と幾何光学

ヘクト光学1 基礎と幾何光学

 

 最後は「光学」です。これは完全な教科書です。ヘクトの光学はいくつかありますが、我々はレイを飛ばしたいので幾何光学について扱った光学1が良いでしょう。

この本には光に関する物理的側面がきちんと解説されています。物理ベ~ス~などといいつつそもそもの光に関する取扱いや解説は漠然としていることが多いレイトレ業界ですが、この本はそういった疑問に対する答えを与えてくれること間違いなしです。

とりあえず一冊持っておくと「あれ、この現象って(物理的に)なんだっけ・・・」となったときにパッと調べることができて便利な本です。

まとめ

さて、レイトレ本書評10連発、いかがでしたでしょうか。自分が興味のある本、面白そうだと思った本をとりあえず読んでみるときっとレイを飛ばすのも捗ることになるでしょう。

表面化散乱の実装とかについて

コメント欄で表面化散乱の話があったので簡単に書いておきます。(一か月くらい前ですね。すいません。あまりこっちのブログは見てないのでツイッターとかのほうが反応は良いです)
表面化散乱とは、物体に侵入した光が物体内部で散乱を繰り返し、別の場所から出てくる現象で、人間の肌や大理石のような物体で顕著に影響が現れます。

表面化散乱の実装はだいたい二種類あり、一つはBSSRDFベースのもので、もう一つは直接散乱をシミュレーションするものです。
前者は非常に高速に実現できるのですが、多少実装が面倒な部分も無くもないです。後者は実装は単純ですが、非常に重くなります。

BSSRDFベースのもの

表面化散乱を拡散理論によって近似、さらにDipoleモデルによって近似することでBRDFのように単純な関数の形で散乱現象を取り扱います。
Dipole以外にもMultipoleとか、いろいろモデルはあります。
このモデルをレンダリングに応用するとなると複数の実装が考えられます。
例えば、普通のパストレではレイとサーフェスの交点から次の反射方向を決める際、新しい始点=現在の交点となります。
しかし、内部における散乱をBSSRDFによってモデル化するとなると、新しい始点=現在の交点の「周辺の点」となります。
この周辺の点ですが、具体的にどこになるか、というのがBSSRDFによって何らかの形で記述されます。たいていは現在の交点を中心として、遠くなるほど確率が小さくなるような確率密度関数を考え、その確率密度に基づいて新しい始点とします。さらに、現在の交点と新しい始点の距離に基づいて光を減衰させます。この減衰もBSSRDFによって記述します。一般的には、遠くなるほどたくさん減衰させます。
あとは、新しい始点から再びレイトレースを行っていくだけで、普通のパストレーシングとなんら変わりません。
このようにすると、内部の散乱をシミュレーションしないでも済むため大変高速に表面化散乱を実現できます。一方で、新しい点をどのようにしてサンプリングするか、という問題がありますし、そもそもBSSRDFをどう記述するか、という問題もあります。これらの解決策もいろいろ考えられますが、後はA Practical Model for Subsurface Light Transportという論文を読むのが良いでしょう。

散乱を直接シミュレーションするもの

さて、一方で散乱を直接シミュレーションするというアプローチもあります。
これは、非常に単純で、散乱のためのパラメータ(散乱係数、位相関数など)を決めておいたら、あとは物体内部における散乱を愚直にシミュレーションするだけです。
散乱のシミュレーションについては多少のバリエーションがあります。
例えば、レイマーチングベースの手法なら、現在位置から進行方向に少しずつレイを進めていき、進めるたびに一定確率で散乱・吸収イベントを起こします。(この確率は散乱係数・吸収係数といった対象物体のパラメータになります)吸収が起これば、そこでトレース全体を打ち切ります。散乱が起これば、位相関数の形状に基づいて新しい方向をランダムに決めます。位相関数の形状が球なら、一様にランダムにどこか別の方向になります。
他にも、次の散乱・吸収イベントが起こる位置を直接サンプリングする、という手法があります。散乱係数と吸収係数から、消失係数というものを求めることができます。この消失係数を使うことで、現在位置からどれくらいの距離進んだら次の散乱・吸収イベントが起こるか、について確率密度関数を作れます。この確率密度関数に従って、すすむ距離を直接サンプリングによって得ることもできます。サンプリングした距離進んだら、レイマーチングの場合と同様、散乱・吸収イベントの処理を行います。
BSSRDFの場合と同様、これ以外はパストレーシングと同じで、光源にヒットするまで処理を続けることでレンダリングを行うことができます。

Precomputed Radiance Trasnferのメモ

マイクロソフト(当時)のSloan氏が発表したPrecomputed Radiance Trasnfer(事前計算済み放射輝度伝達)の簡易的なメモ。

リアルタイムに相互反射や無限遠からの環境マップによるImage Based Lightingを考慮したライティングを行うのはかなり大変である。これを解決する手法。

さて、IBLをリアルタイムに行うのはかなり大変である。あるピクセルの色を決定するには、そのピクセルに対応するシーン中のある点の色、すなわち放射輝度を決定しないといけない。これは、その点における以下のような積分を解く必要がある。(なおシーンは簡単のため全て完全拡散面としておく(PRTは完全拡散面以外も扱える))

L_o(x, \omega) = \frac{\rho(x)}{\pi} \int_{\Omega} L_i(x, s) \cos{\theta} d\omega(s)

ここで、\rhoは各点における反射率であり、その点における色や見え方を決定する。さて、右辺の積分を解くことによってL_oの値がもとまり、これは最終的にレンダリングされる画像の各ピクセル値に対応する。しかし、右辺の積分を解くと一口に言っても大変である。相互反射などはどうすればいいのか、といった問題や、そもそもどう積分を解くのか(モンテカルロ法を使うのか、使わないのか)といった問題がたくさんある。

今回は「リアルタイム」に「IBLの影響」を解きたいという状況だと仮定して、どんどん近似を入れていくことで問題を解くことにする。まず、相互反射を考慮しないことにする。すなわち、各点は全て光源から直接照明される以上に、ほかの影響は受けないと考える。(後でこの制限は取り払う)すると、上の式は以下のようになる。

L_o(x, \omega) = \frac{\rho(x)}{\pi} \int_{\Omega} L_e(s) V_x(s) \cos{\theta} d\omega(s)

ここで、L_eはある方向からくる放射輝度の関数であり、これが今回の光源すなわちImage Based Lightである。\cos{\theta}はその位置における法線と方向sの成す角度によるcosである。V_x(s)というのは可視関数で、位置xにおいて、方向sを見たとき、光源(環境マップ)が可視か、それとも別のオブジェクトに遮蔽されて不可視か、を表したものである。可視なら1、不可視なら0になる。
Image Based Lightingというのは、通常点光源、面光源などを扱うコンピュータグラフィックスにおいて、光源を以下のような環境マップによる画像ベースのものにする、というものである。


(Light Probe Image Gallery(http://www.pauldebevec.com/Probes/)より)

この画像の各ピクセルはある方向からくる放射輝度値を表現しており、上のL_eはこの値を得るためのものである。環境マップは、レンダリングしているシーンから十分に遠くに存在する巨大な球に張り付けられたテクスチャであると考えることもでき、それゆえにシーン中の位置に依存しない関数になっている。

ここで球面調和関数が出てくる。球面調和関数は完全直交関数系であり、球面上の任意の関数g(\theta, \phi) を展開できる、とウィキペディアにある。上で出てきた関数L_eV_xも、cos{\theta}も全て方向にのみ依存する関数である。よって、これらは全て球面調和関数として展開できる。この時、何次の項まで展開するかを指定することが出来、次数が多くなればそれだけ精度も増すが、データ量や計算負荷も大きくなる、トレードオフになる。

PRTにおいては、まず、レンダリングしたいデータの各頂点(等)においてV_xcos{\theta}を求める。これは離散的な結果になる場合がある。次に、これらの関数の積を求め、これを球面調和関数で表現し、頂点ごとに別途保存しておく。また、入力として与えたい光源である環境マップについても、球面調和関数として表現する。(これはランタイムで行ってもよい)

レンダリング時には、各頂点において、V_xcos{\theta}の積たる球面調和関数と光源である環境マップの球面調和関数を復元し、全方向について積分してやれば、それはそのまま\int_{\Omega} L_e(s) V_x(s) \cos{\theta} d\omega(s) 積分したことになり、望む結果が得られる。さらに、ここからが球面調和関数の優れたところだが、実際には具体的な関数を復元する必要も、全方向について積分する必要もなく、各係数について内積をとるとそれが最終的に求めたい積分の結果になる。これらの内積の処理は高速に行うことが出来る。光源である環境マップが変化しても、環境マップの球面調和関数としての表現さえ存在すれば、単なる内積によってリライティングができ、しかもそれはちゃんと可視判定を考慮したものとなっているため、高品質なシェーディングが期待できる。

相互反射

さて、以上の話は直接光に限定した話だったが、PRTは間接光を考慮したものに拡張することが出来る。ある点において、環境マップが可視の方向からくる光は、そのまま環境マップの値だが、不可視の方向からくる光は別の場所で一度反射した光、すなわち間接光である。まず、各頂点においてV_xcos{\theta}を計算し、球面調和関数を求める。次に、各頂点から直接光の来ない方向、すなわち不可視の方向にレイをとばし、別のオブジェクトとの交点yを求める。

yが求まったら、その点の位置において同様にして球面調和関数を求める。この球面調和関数と環境マップによって計算される値とは、つまりyからxへと反射される光に他ならない。そこで、yにおける球面調和関数の値について、yにおける反射率と積分の際のその方向への立体角の分をスケーリングしてxにおける球面調和関数に加算してやる。すると、いざレンダリングするときに、L_o = M_x \cdot L_eという関係だったものが、L_o = (M_x + K_y M_y + ... ) \cdot L_eというものになり、xにおいて直接反射する光と、別の点yなどを経由して反射する光の両方が考慮された結果が得られる。
(ここでL_eM_xなどは球面調和関数の係数として表現された各項で、K_yはスケーリング係数)