C# で学ぶレイトレーシング




はじめに

ここではレイトレーサの作成方法について説明します。 レイトレーシングに関する説明だけではなく、 実際のプログラム作成(実装)も行います

文章は少しずつ追加されていきます。 追加のお知らせは Twitter の飯倉研アナウンス用アカウント @gra_lab にて tweet していきますので、興味のある方はフォローしてみて下さい。

講義では教科書として Peter Shirley, R.Keith Morley の "Realistic Ray Tracing" (RRT) を使っています。 あわせて読んでいただければより理解が進むと思います。


ToyBox

一連の文書では、 ToyBox と呼ばれる、実際に動作する レイトレーサを C# で段階的に実装していきます。 上にある画像は ToyBox にて生成したものです (背景画像に急須と兎と球を載せたものです)。

作成するレイトレーサは以下の機能を持ちます:

・マルチコア対応 - コア数に応じて高速になります
・出力形式として OpenEXR および .ppm ファイルをサポート
・モデル形式として .ply フォーマットを使用
・光沢面での反射および屈折
・面光源のサポート(ソフトシャドウの実現)
・被写界深度表現
・形状インスタンス
・.ppm ファイルによるテクスチャマッピング
...etc

とりあえずダウンロードして遊んでみたい方や、作成するレイトレーサ ToyBox の 詳細に興味のある方はこちらのページをご覧下さい (「ToyBox2012 について」)。



目次

No.12 でひとまず完成するレイトレーサは 4,000 行程の プログラムとなります。

4,000 行と聞くと多く感じるかもしれませんが、実際には 64 個のファイルに 分かれており、短いものでは 1 ファイルあたり 10 行程度です (最も長いものでも 250 行程度です)。 また、これらのプログラムを一気に作成するのではなく、 各文章ごと少しずつ作成していきます。


各文章の内容(大部分は準備中)

No.1 画像ファイルへの書き込み方法   → [読む...]
.ppm ファイルフォーマットについて説明し、実際に .ppm フォーマットで 書き込みを行う Image クラスを作成します。

補足メモ1-1 : ToyBox のファイル構成   → [読む...]
補足メモ1-2 : コピペとプログラミング言語の学習に関する独断と偏見


No.2 乱数について   → [読む...]
各種の乱数の発生方法について説明します。 乱数発生クラス(RNG クラス)の実装も行います。

補足メモ2-1 : (Jump 付き) C# 用 TinyMT の作り方   → [読む...]


No.3 ベクトル型の整備   → [読む...]
3 次元のベクトル型クラスについて説明します。


No.4 レイキャスト
レイを追跡(トレース)する前に、まずはレイを投げて(キャスト)みます。 レイキャストを用いて形状データが画像として現れる仕組みを解説します。


No.5 シェーディング
CG において「影」と「陰」は処理内容が異なります。 ここでは「陰」の処理について説明します。


No.6 レイトレーシング
レイの追跡方法について解説します。 レイトレーシングのもっとも基本的な構造をここで実装します。


No.7 フィルタ
数理的に表現されたものをデジタル画像として表す時、無視できない 量子化ノイズが現れる事があります。 ここでは Shirley の方法により量子化ノイズが減る様子をみていきます。


No.8 エリアライト
これまでは全て大きさを持たない光源を取り扱ってきましたが、 ここでは大きさを持つ光源を取り扱います。 これによりソフトシャドウの表現が可能になります。


No.9 被写界深度
ピントの概念を導入します。 これにより手前と奥がボケているような画像を生成することが可能になります。


No.10 グロッシーサーフェイス
光沢面での反射・屈折を実現する方法について説明します。

補足メモ 10-1 : OpenEXR について


No.11 テクスチャマッピング
.ppm ファイルの読込処理を実装し、テクスチャマッピングを実現します。


No.12 ポリゴンメッシュとインスタンス
.ply フォーマットについて説明し、CG 研究でよく出てくる ティーポットのレンダリングを行なってみます。

あわせて形状のインスタンス機能も実装します。


No.13 高速化
基本的な高速化処理について説明します。 レンダリング速度を向上させて、スタンフォード大の兎の レンダリングを行います。 この回でレイトレーシングプログラムの基礎的な説明は終わりです。


一連の文章ではレイトレーシングやその実装方法などに関する説明は 行いますが、C# についての解説や Visual Studio の操作方法、 線形代数の基礎などについては説明を行いません。 これらについては各自で勉強して下さい。



参考図書

ここでの説明は本当に初歩的なものなので、より詳しく レイトレーシングについて学びたい人の為に 以下の書籍やページを挙げておきます:

[1] "Realistic Ray Tracing" second edition, Peter Shirley, R.Keith Morley 著、A K Peters
[2] “Ray Tracing from the Ground Up”, Kevin Suffern n 著、A K Peters
[3] “An introduction to ray tracing”, Andrew S. Glassner r 編、 Morgan Kaufmann
[4] “Physically Based Rendering”, Matt Pharr, Greg Humphreys s 著、 Morgan Kaufmann
[5] "The RenderMan Companion", Steve Upstill 著、Addison Wesley
[6] www.blender.org
[7] "CG レイトレ物語"、 高桑昌男 著、アスキー出版局

[1] の "Realistic Ray Tracing" (以下、RRT と略す事もあります)は ページ数も 200 ページ程の本で、持ち運びもしやすく C++ で書かれた ソースコードも載っている非常に良い本です (講義ではこの本を教科書として使用します)。

今回作成した ToyBox も、当初はこの RRT の内容を C# で書き換える程度で 考えていました。 しかし実際に実装を進めていくうちに随分と違う形になってしまいました。 その理由のひとつとして段階的な開発にこだわった点があります。 できるだけ同じコードは書かない、収穫を基本とするライブラリ化や 作成したファイルへの追加・削除は行わない-といった進め方に関する 「こだわり」です。 とは言え随所に RRT の影響を見ることができると思います (フィルタ処理に関する部分や、入出力形式に .ppm フォーマットを 採用している点などは RRT からの影響が大きな部分です)。

また RRT と比べ ToyBox では美しい画像の生成に関するこだわりが少しばかり 詳細に述べられています。 この点(だけでは無いのですが)に関しまして、高桑昌男先生に 大変お世話になりました。 高桑ゼミを卒業して 10 年以上経つにも関わらず色々と相談にのっていただきました。 高桑先生と言えば RayCustom の作者としても有名ですが、 色々お教え頂いたお蔭で ToyBox にもほんの少しだけ RayCustom の 香りが注がれています。


[2] も RRT と同様の趣旨の本ですが、ページ数が異なります。 こちらは大判で 700 ページ超の本。重いです。 しかしページ数が多いので RRT よりも詳細に書かれています。 RRT でちょっとよく分からないな、という人はこちらを見てみると良いでしょう。


[3] の “An introduction to ray tracing” は 1989 年の本ですが、鏡 面透過表現に関しての記述があります。 オムニバス形式の本なので、その他にも色々と書かれています。 古い本ですが、読む価値のある本です。


[4] 通称 PBRT (PBRT 本)。千ページ超の非常に重い本。 この本もソースコードと解説という形式で記述されていますが、 ソースコードは少し読みづらい。 扱っている範囲は広く、分からない部分を辞書的に調べるという 使い方でも良いかもしれません。


[5] の "RenderMan Companion" にある RenderMan とは、 言わずと知れた PIXAR が販売しているレンダラの事です。 この "RenderMan Companion" は数々の映画で 実際に使われている RenderMan についての古い解説書です。 RenderMan に関する書籍としては古いものですが、 インタフェイスの設計等は大変参考になります。

RenderMan 自体はスキャンラインレンダラであり、レイトレーサではありません。 しかしながら ToyBox ではシーンの記述方式やシェーダプログラム等に その影響が色濃く反映されています。


[6] の Blender.org はオープンソースの CG 統合ソフト Blender の サイトです。ToyBox の開発に当たってはリニアなカラースペースから SRGB への 変換部分や OpenEXR フォーマットでの出力部分を参考にしています。

より本格的な CG ソフトを自作する場合等、Blender のソースコードは 参考になるのではないかと思います。


[7] の "CG レイトレ物語" は絶版で入手困難な品になっていますが、 ネット通販等で見かけたら是非とも入手されることをお勧めします。 レイトレーシングの本でありながら読み物的に楽しく読める本です。

この本で私がもっとも好きな部分は「あとがき」です。 この「あとがき」は1990 年に書かれているにも関わらず、 その後の Non Photorealistic Rendering の台頭等 いくつかの事柄が予言的に書かれていたりして、 それだけでも十分に楽しいのですが、 映像表現としての CG とは何か?という極めて根源的な問が この「あとがき」にはあります。