Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
グローバルイルミネーション入門
藤田将洋 Syoyo Fujita
更新 平成 16 年 9 月 11 日
1 注意本書は未完であり、また書き始めたばかりである。そのためまだ途中までしか書いていなかったり、構成がよくなかったり、ところどころ間違った記述が修正されずに残っていることに注意してほしい。
2 導入本文では、グローバルイルミネーションの入門から、より詳しいアルゴリズムの解説までを行ない、グローバルイルミネーションの包括的かつ技術的な知識を与えることを目的としている。
グローバルイルミネーション (global illumination)1は、三次元コンピュータグラフィックスにおける、現在主流かつ研究がさかんなレンダリングアルゴリズムの総称もしくは研究領域である。グローバルイルミネーションの特徴は、写実的な CG 画像を作成したり、物理学的に正確な光のふるまいによるシミュレーションによる CG 画像を生成することが可能なことである。
2.1 グローバルイルミネーションとは?
図 2 に、グローバルイルミネーションを用いないで直接光のみでレンダリングした画像と、グローバルイルミネーションを用いて間接的な照明も考慮してレンダリングした画像の比較を示す。グローバルイルミネーションの威力を理解するのは明らかだと思う。基本的なグローバルイルミネーションのアルゴリズムの研究は二十年以上前から行なわれてきているが、近年とくにこの分野に注目が集まってきている。その理由は、もともとグローバルイルミネーションは膨大な計算量が必要であったが、コンピュータの処理性能の向上や、新しい高速なアルゴリズムの提案により、ゲームなどのインタラクティブグラフィックスにおいてグローバルイルミネーションを用いることができるようになってきていることが挙げられる。多くのゲームは映像のリアリティを求めており、グローバルイルミネーションはリアリティを与える手法であるため、両者が結びつく。
1大域照明、広域照明とも訳される
1
(a) (b)
図 1: (a) グローバルイルミネーションなし。 (b) グローバルイルミネーションあり。シーンモデル (Sponza Atrium)の著作権は Marco Davoic に帰属する
映画や TV などの CG 映像の制作に時間をかけることができる分野では、すでにその多くにグローバルイルミネーションが用いられており、リアリティの向上に貢献している2。
グローバルイルミネーション ローカルイルミネーションアルゴリズムの根幹 物理シミュレーション 知覚的、経験則処理速度 遅い 非常に高速アートディレクション やや困難 容易
表 1: グローバルイルミネーションとローカルイルミネーションの比較
ただし、グローバルイルミネーションには、計算量以外にも大きな問題がある。それは物理的な正確性に基づいてアルゴリズムが記述されているので、アルゴリズムは数学的、物理学的に複雑で、深い知識がないと理解するのが困難であるということである。
本文は、より技術的なグローバルイルミネーションの解説、とくにグローバルイルミネーションのアルゴリズムの解説を行なう。また同時に、それらを理解するために必要な数学的、物理学的知識についても解説したいと思う。本文の構成は以下のようになっている。まず最初は、グローバルイルミネーションアルゴリズムの歴史を見ていく。これはグローバルイルミネーションのアルゴリズムの論文が、 SIGGRAPH などのコンピュータグラフィックスの学会で発表された年度をもとにしている。その後、年代順に提案されたグローバルイルミネーションのアルゴリズムの詳細を解説する。次に、グローバルイルミネーションの計算を高速化することが可能な、より少ないサンプル数で収束が早い準モンテカルロ
2ただしフル CG 映画などでは、それでもまだすべてをグローバルイルミネーションでレンダリングするには時間がかかりすぎるので、ローカルイルミネーションが用いられているのがほとんどである
グローバルイルミネーション入門 2
法について解説する。
2.2 グローバルイルミネーションのススメさて、本書ではグローバルイルミネーションの技術に興味があるのだけれども、そのまえにグローバルイルミネーション、ひいてはコンピュータグラフィックスのレンダリングアルゴリズムという分野のすばらしさを 3 点にまとめて紹介し、広く本分野へ興味を引かせたいと思う。
まず、レンダリングは取り組みやすい。結果が画像として現れるので、自分のやった作業の結果がわかりやすい。そしてとくにグローバルイルミネーションは写実的できらびやかな画像を生成できるので、取り組むモチベーションが湧いてくる。そしてこれらはプログラムを書くだけで生成できるのである! 大規模な実験機器や特殊なグラフィックスハードウェアや、ソフトウェアなどは必要ない。そのため最初の理論を理解するだけであれば、レンダリング時間にはそれほど気をかけることはないだろうから、ノート PC でも趣味感覚でゆっくりお気軽に行なうことができる。
また、レンダリングはシミュレーションであるので客観的な仕事である。キャラクタモデルの制作やデザインの仕事は個人の美的センスが問われるが、レンダリングはそのようなことは無い。100 人がレンダラを書けば、だいたいが同じ結果の画像が生成されるのが期待される。レンダラに主観的な要素を取り入れるのはナンセンスである。レンダラはデータに客観的であるべきであるし、それを超えて画像に主観性を与えるのは、アーティストに委ねられるべきである。よって、レンダラの制作において、レンダラ書き自身の美的センスという才能的な要素を問われることはないので、知識さえあればだれでもレンダラの制作を行なう事ができる3。そして最後に、レンダリングは学問的に興味深くそして奥深い分野である。高校時代に、いままでの学校での教育は将来役に立つのか? という疑問は誰しも抱くものであろう。レンダラが生成するきらびやかな画像の裏側は、数学のオンパレードである。とくに中学・高校で習う (たぶん習うであろう)代数・ベクトル・行列がそのままでてくる。ベクトルの内積という訳の分からなかったものがシェーディングの中核で用いられ、きれいな絵と結びつく。またグローバルイルミネーションではさらに物理の知識も含まれてくる。レンダリングは、高校時代に感じた疑問に応えてくれる貴重な分野の一つであろう。コンピュータグラフィックスに深く関わるようになると、コンピュータグラフィックスは物理学、統計学、金融工学などいろいろな分野からの応用で成り立っているということが判るかと思う。そのためコンピュータグラフィックスの研究では幅広い分野の研究を知っておく必要があり、そのたびに知的探究心が刺激される。
2.3 レンダリングとは?
レンダリングは、現実世界におけるカメラとシーン (世界、環境)を、コンピュータの中でシミュレートすることである。こんな説明ができるだろう。
真っ暗で何もない世界がある。世界を照らすには、まずライトが必要だ。ライトを配置3近年はアニメ調や鉛筆画風などのアーティステックなレンダリング画像を生成するノンフォトリアリスティックレンダ
リングというアルゴリズムの研究がさかんであるが、これはそのアート的な処理を一連の手続きで与えるという意味でやはり客観的なシミュレーションとして考えることができよう。
グローバルイルミネーション入門 3
しよう。そして、ライトで照らされる物体が必要だ。机やいすや壁などを配置しよう。そして、カメラを配置し、シャッターを押して世界をフィルムに保存する。このシャッターが押された時にフィルムに飛び込んでくる光を考えてみよう。
まず、光はライトから発せられる。その発生のしかたを考えねばならない。光が物体に当たったら、その反射のふるまいを考えねばならない。金属のようにするどく反射する場合もあるだろうし、ざらざらした紙のように均一に反射する場合もあろう。ビロードの服だったら、ある方向の向きに反射の特徴が表れるだろう。鏡があったら映り込みが生じるし、ガラスがあったら光は透過・屈折していく。光は物体に遮られるかもしれない。物体に遮られるかどうかの判定も必要だ。最終的に光は何回か反射して、そのわずかないくつかはカメラに飛び込んでくるだろう。これをフィルムに記録する。
うぉぉぉぉぉ、これだけでも膨大な計算量になるのは想像に難くないッ!!!。しかし、だッ!!実は、光源は隣の部屋で点いていて、カメラは隣のライトのない真っ暗闇の部屋にあるかもしれない。このときは、真っ黒な画像ができあがる。明らかに今までの計算は無駄であった! もしカメラがライトで照らされていない方向を向いているのであるのを知っていれば、何も全部計算しなくてもよかったのに...
こんなことが無いように、特にグローバルイルミネーションでは、いかにカメラに入射してくる重要な光の経路のみを見つけ出すか、いかに物理的に正確でありつつも無駄な計算をはしょって高速化を図るか、が研究の中心である。
3 アルゴリズムの歴史主要なグローバルイルミネーションアルゴリズムの年表と遷移を図 ?? に示す。アルゴリズムが
発表されたときのそのアルゴリズムの形態を、大きくオフラインとリアルタイムで分けた。オフラインはオフライン向け (映画などのようにレンダリングに時間をかける分野)のアルゴリズム、リアルタイムはリアルタイム向け (ゲームや GPU で処理できる分野)のアルゴリズムを示している。近年はリアルタイム向けのグローバルイルミネーションアルゴリズムの提案が行なわれていることが見て取れると思う。図中の矢印は、アルゴリズムの発展関係を示している。たとえば、分散レイトレーシングは、レイトレーシングを基としておりその発展版であるため、レイトレーシングから分散レイトレーシングへと矢印を引いてある。
3.0.1 レイトレーシング法
最初のグローバルイルミネーションアルゴリズムは、レイトレーシング法 (ray tracing)4である。最初のレイトレーシング法は Appel ら [2]により提案された5。これは再帰の無い一次レイ (視点から発せられるレイ)のみ、かつ直接光の影のみを考慮していた。その後 Whitted [24]はこのレイキャスティング法を再帰的に適用し、反射・屈折透過を表現した6。Whitted は [24] で global
4光線追跡法とも訳される5Appel らのレイトレーシング法は、現在ではレイキャスティング法 (ray casting) として知られている。6Whitted により提案されたレイトレーシング法は、その後の各種のレイトレーシング法の拡張手法と区別するため、
現在ではクラシックレイトレーシング (classic ray tracing) 法とも呼ばれている。
グローバルイルミネーション入門 4
ラジオシティCohen 1984, Nishita 1985
レイトレーシングWhitted 1979
パストレーシングKajiya 1984
PRTSloan 2002
ウェーブレットライティングNg 2003
双方向パストレーシングLafortune 1993, Veach 1994
リアルタイムオフライン
1980
1990
2000
分散レイトレーシングCook 1984
フォトンマッピングJensen 1993
メトロポリス光輸送Veach 1997
図 2: 主要なグローバルイルミネーションアルゴリズムの年表と遷移
illumination という言葉を用いてレイトレーシング法を説明している7。Whitted のレイトレーシング法の提唱により、ローカルイルミネーションからグローバルイル
ミネーションへと方法論が進化した。Whitted のレイトレーシング法は、今までは分けて考えていた遮蔽 (occlusion)・反射屈折効果・影 (shadow)を統一的に表現することを示したという点でも重要である。
3.0.2 分散レイトレーシング法
Whittedのレイトレーシング法では、各レイがサーフェスで跳ね返るときの分岐は最大でも、反射と、屈折もしくは透過の 2 本であるために、完全な鏡面反射 (perfect specular reflection)・完全
7私が知る限りでは、global illumination という単語が出てきたのはこの Whitted の論文が最初である。
グローバルイルミネーション入門 5
Computer Graphics Volume 18, Number 3 July 1984
Figure 8. 1984.
145
図 3: 分散レイトレーシングによる画像。[7] より引用。
な屈折 (perfect refraction)・ハードシャドウ (hard shadow)などのくっきりしたレンダリング画像しか表現できなかった。そこで Cookら [7]は、1 本のレイがサーフェスで跳ね返るときに複数のレイを分散して新しく飛ばすことで、ぼやけた反射や屈折 (blurred reflection and refraction)・ソフトシャドウ (soft shadow)を表現することができる分散レイトレーシング (distribution ray tracing)法が提案された8(図 3 参照)。またこの手法では、被写界深度 (depth of field)・モーションブラー (motion blur)などのカメラ
効果も統一した枠組みで表現することが可能になっている。通常、分散レイトレーシング法と以下で述べるパストレーシング法はモンテカルロレイトレーシング法 (Monte Carlo ray tracing)とも呼ばれることが多い。
3.0.3 ラジオシティ法
ラジオシティ(Radiosity)法は、Goral ら [10] および Nishita ら [15] により提案された。ラジオシティ法では、伝熱工学の理論を元に、光をエネルギーとして捉える。シーン内の物体をパッチ (微小面積)要素へと分割し、それらパッチ間でエネルギー伝達を行うことにより光輸送の計算を行う。
8オリジナルの Cook らの論文の題名は Distributed Ray Tracing であるが、後に複数のコンピュータで並列にレイトレーシング処理を行うという意味での distributed ray tracing と区別するために、現在では Cook らの手法は distributionray tracing と呼んで区別されている。
グローバルイルミネーション入門 6
ラジオシティ法では、レイトレーシング法では表現が難しい柔らかな間接光の表現が可能になっているため、建築物のレンダリングや照明シミュレーションなどの分野で広く使用されている。
3.0.4 パストレーシング法
パストレーシング法 (path tracing)9は、Kajiya[12] によりレンダリング方程式の提案と同時にそのレンダリング方程式の解決として提案された手法である。パストレーシング法では、レンダリング方程式をモンテカルロランダムウォークで解くことにより、各レイがサーフェスで跳ね返るときには 1 本しか反射レイをしないレイトレーシングである。そのため分散レイトレーシングのように各レイの跳ね返りで指数関数的にレイの本数が増えていくことを抑えることができる。
3.0.5 メトロポリス光輸送
メトロポリス光輸送 (Metropolis light transport, MLT)は、都市の名前ではありません。... 現在では、パストレーシング法は多くの商用レンダラのグローバルイルミネーションアルゴリズムとして用いられている。
3.0.6 前計算放射輝度伝達 (PRT)法
前計算放射輝度伝達法 (Precomputed Radiance Transfer, PRT 法)は、Sloan [20] らにより提案された手法である。PRT 法では、放射輝度の伝達をあらかじめシミュレーションしておき、また同時に球面調和関数 (spherical harmonics)でそれら伝達の結果を展開しておくことで、前述の手法とは異なりインタラクティブに変化するシーンをレンダリングすることができる。
PRT 法では、低周波の照明分布において遮蔽も考慮された正確な照明積分を表現する。
3.1 照明アルゴリズムのまとめ’70 年代、 ’80 年代初頭で提案されてきた、ローカルイルミネーションモデル、レイトレーシ
ング法、ラジオシティ法などの各種レンダリングアルゴリズムは、Kajiya のレンダリング方程式[12](付録 A 参照)により一旦まとめられ、それらが統一された概念で記述できることが示されることになる。グローバルイルミネーションの研究は、Kajiya のレンダリング方程式とその後に提案された光
輸送方程式 [3, 23]を基礎とした物理学的な観点から ’90 年代を通じて発展してきた。グローバルイルミネーションアルゴリズムが、既存のローカルイルミネーションアルゴリズムと区別される点をまとめると、以下の 3 点に集約される。
• 間接照明 (indirect illumination)間接照明は、直接サーフェスに入射してくるのではなく、壁などに何度か反射してからサーフェスに入射してくる光のことである。図 2b を見ても分るように、間接照明はリアルな画像生成において非常に重要な要素である。
9経路追跡法とも訳される
グローバルイルミネーション入門 7
• 遮蔽 (occlusion)遮蔽 (および影)は、光が壁や物体などに遮られて生じる現象である。遮蔽は、遮蔽の無いレンダリング結果と比べて、視覚的に深みを与え、物体の存在感を際立たせる要素として重要である。遮蔽の計算は解析的に行うのは非常に困難であるので、通常はモンテカルロレイトレーシングなどのモンテカルロ法を用いて確率論的に計算することが多い。また物体が動く動的なシーンでは前もって遮蔽の変化を正確に計算することは困難である。正確な遮蔽の計算は現在のチャレンジングな研究の 1 つとなっている。
• 物理学に基づく照明計算正確なシミュレーションによりレンダリングを行うには、物理学に基づいて単位を取り決めて照明計算を行うことが必要となる。グローバルイルミネーションの研究はこの物理学に基づく照明計算と共に発展してきた [?]。
4 プログラミングツールと準備本書でのレンダリングアルゴリズムの実装では、フリーソフトウェアのプログラミングツールを使用します。レンダラは本質的にはデータを受け取って画像を生成するプログラムなので、コマンドライン環境を前提として、OSやウィンドウシステムには極力依存しないようにします。UNIX系 OS(Linux, FreeBSD, Solaris)や Mac OS Xにはコマンドライン環境が提供されていますので問題はありませんが、Windows にはありません。Windows を開発環境に使用されたい人は cygwinをインストールされることをお勧めします。cygwin は Windows 上で UNIX 環境を提供するソフトウェア群で、gcc などの開発環境も簡単にインストールできます。本書のプログラムのコンパイルには gcc(GNU Compiler Collection) を推奨します。gccはほぼすべての OS に移植されているコンパイラです。本書のプログラムはこの gcc でコンパイルの確認をしています。しかし基本的にコンパイラ依存のコードは書かないようにしているので、他のコンパイラでのコンパイルには大きな問題は無いと思います。
4.1 画像の保存レンダラの仕事は、シーンデータをファイルやモデリングソフトから受け取って画像を生成することです。まずは画像だけを保存するプログラムを作成します。ここで PNG や Jpeg などの形式のフォーマットで画像を保存するプログラムを自分で 1 から組むのはとても大変です10。そこでこのチュートリアルでは、プログラムが簡易なフォーマットである PPM(Portable PixMap) を採用することにする。PPMは簡単なアスキー形式のフォーマット (バイナリフォーマットのバージョンもある)である。PPM は読み書きのプログラムを簡単に作成することができるが、欠点としてファイルサイズが巨大 (数 M バイト程度)になってしまうので注意して欲しい。PPM はだいたいどのような画像ビューワでも見ることが可能である11。以下は PPM で画像を保存するサンプルプ
10libpng(URL をここに) や libjpeg(URL をここに) などのフリーの画像フォーマットライブラリを利用する手もあるがここでは取り扱わない
11たとえば、Windows だと IrfanView(URL をここに) などが挙げられます
グローバルイルミネーション入門 8
ログラムです。
/*
* ppmsave.c
*/
#include <stdio.h>
int
main(int argc, char **argv)
FILE *fp;
int i, j;
int width = 256;
int height = 256;
const char filename[] = "image.ppm";
fp = fopen(filename, "w");
if (fp == NULL)
printf("Cannot create file : %s\n", filename);
exit(-1);
fprintf(fp, "P3\n"); /* magic number */
fprintf(fp, "%d %d\n", width, height);
fprintf(fp, "255\n"); /* max pixel value */
for (j = 0; j < height; j++)
for (i = 0; i < width; i++)
fprintf(fp, "%d %d 255 ", i, j);
fclose(fp);
このプログラムを実行すると、image.ppmというファイルが作成され、そのファイルを画像ビューワで開くと図 4 のような画像が確認できる。
グローバルイルミネーション入門 9
図 4: PPM 画像出力例
4.2 OpenGL による PPM ビューワOpenGL になじみのある読者は、PPM 画像の表示は画像ビューワを利用しなくとも以下の
OpenGL(+GLUT) プログラムで表示を行なうことも可能である。
#if defined(__APPLE__) && defined(__MACH__)
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdio.h>
#include <stdlib.h>
static int width, height;
static GLubyte *image;
void
display()
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
glRasterPos2i(0, 0);
glDrawPixels(width, height, GL_RGB, GL_UNSIGNED_BYTE, image);
グローバルイルミネーション入門 10
glFlush();
glutSwapBuffers();
void
key(unsigned char key, int x, int y)
if (key == 27) exit(0); /* ESC key */
void
reshape(int w, int h)
glViewport(0, 0, (GLint)w, (GLint)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 1.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
int
main(int argc, char **argv)
FILE *fp;
char buf;
int i, j;
int maxval;
int r, g, b;
if (argc < 2)
printf("Usage: %s filename.ppm\n", argv[0]);
exit(-1);
fp = fopen(argv[1], "r");
if (fp == NULL)
printf("Can’t open file: %s\n", argv[1]);
exit(-1);
グローバルイルミネーション入門 11
/* file has a correct magic number? */
if (fgetc(fp) != ’P’ || fgetc(fp) != ’3’ || fgetc(fp) != ’\n’)
printf("File is not a ppm format.\n");
exit(-1);
/* skip comments. */
while((buf = fgetc(fp)) == ’#’)
while(fgetc(fp) != ’\n’); /* skip until newline. */
ungetc(buf, fp);
/* get image width and height. */
fscanf(fp, "%d %d\n", &width, &height);
/* get max value. */
fscanf(fp, "%d\n", &maxval);
image = (GLubyte *)malloc(width * height * 3 * sizeof(GLubyte));
for (j = height - 1; j >= 0; j--)
for (i = 0; i < width; i++)
fscanf(fp, "%d %d %d ", &r, &g, &b);
image[(i + j * width) * 3 ] = (GLubyte)r;
image[(i + j * width) * 3 + 1] = (GLubyte)g;
image[(i + j * width) * 3 + 2] = (GLubyte)b;
glutInit(&argc, argv);
glutInitWindowPosition(0, 0);
glutInitWindowSize(width, height);
glutCreateWindow(argv[0]);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutKeyboardFunc(key);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
グローバルイルミネーション入門 12
glutMainLoop();
5 レイトレーシング実装まずはレイトレーシングの実装から始めよう。
5.1 直線と球との交点の計算レイの進む方向の直線が球と交差するかを求める必要がある。これは中学で習う直線と円 (球)
の交わりを計算することと同じである。直線と球の交点は、代数的に求めることもできるが、グラフィックスではベクトル計算が主になることから、ここではベクトル幾何の考えから直線と球の交点を求めることにしよう。レイは、原点
−→p と方向ベクトル
−→d (ここでは計算を簡単にするために、この方向ベクトルは長
さが 1 の単位ベクトルとする。つまり∣∣∣−→p
∣∣∣ = 0)の 2 つの変数で定義することができる (図 5)。
O
−→d
図 5: レイの表現
このレイがたどる軌跡によってできる直線上の任意の点−→x は、パラメータ t を用いて、
−→x =
−→p + t
−→d (1)
と表現することができる。ここで、先ほど述べたように−→d は単位ベクトルであるので、パラ
メータ t はレイの原点−→p から点
−→x までの距離と考えることができる。
球は、 ∣∣∣−→x −
−→c
∣∣∣2
= r2 (2)
と表現することができる。ここで−→c は球の中心、r は球の半径である。直線の式 1 を、球の式 2
に代入すると、
r2 =∣∣∣(−→p + t
−→d ) −
−→c
∣∣∣2
=((−→p + t
−→d ) −
−→c
)((−→p + t
−→d ) −
−→c
)
=(t−→d + (
−→p −
−→c )
)(t−→d + (
−→p −
−→c )
)
=∣∣∣−→d
∣∣∣ t2 + 2−→d ·
−→cpt +
∣∣∣−→cp
∣∣∣
グローバルイルミネーション入門 13
よって t に関する二次方程式
∣∣∣−→d
∣∣∣ t2 + 2−→d ·
−→cpt +
∣∣∣−→cp
∣∣∣ − r2 = 0
が得られる。ここで二次方程式の解の公式を当てはめると、
t =−−→d ·
−→cp ±
√(−→d ·
−→cp
)2
−∣∣∣−→d
∣∣∣(|−→cp|2 − r2
)
∣∣∣−→d
∣∣∣2
交差判定を行ない、レイがヒットしたところは青色で、ヒットしないところは黒色でレンダリングするプログラムである。
1 /*
2 * raytrace1.c
3 */
4 #include <stdio.h>
5
6 static double sphere_position[3] = 0.0, 0.0, -2.0;
7 static double sphere_radius = 0.5;
8
9 int
10 intersect(double ray_origin[3],
11 double ray_direction[3] /* unit vector */ )
12
13 double oc[3]; /* the vector from sphere center to ray origin */
14 double b, c, d;
15 double sr2;
16
17 oc[0] = ray_origin[0] - sphere_position[0]; /* x */
18 oc[1] = ray_origin[1] - sphere_position[1]; /* y */
19 oc[2] = ray_origin[2] - sphere_position[2]; /* z */
20
21 b = 2.0 * (ray_direction[0] * oc[0] +
22 ray_direction[1] * oc[1] +
23 ray_direction[2] * oc[2]);
24 sr2 = sphere_radius * sphere_radius;
25 c = oc[0] * oc[0] + oc[1] * oc[1] + oc[2] * oc[2] - sr2;
26
27 d = (b * b - 4.0 * c);
28 if (d > 0.0) return 1; /* hit */
29
グローバルイルミネーション入門 14
30 return 0; /* no hit */
31
32
33 int
34 main(int argc, char **argv)
35
36 FILE *fp;
37 int i, j;
38 int width = 256;
39 int height = 256;
40 double sx, sy;
41 double hw, hh;
42 double org[3], dir[3];
43 const char filename[] = "image.ppm";
44
45 fp = fopen(filename, "w");
46 if (fp == NULL)
47 printf("Cannot create file : %s\n", filename);
48 exit(-1);
49
50
51 hw = (double)width / 2.0;
52 hh = (double)height / 2.0;
53 dir[0] = 0.0;
54 dir[1] = 0.0;
55 dir[2] = -1.0;
56
57 fprintf(fp, "P3\n"); /* magic number */
58 fprintf(fp, "# raytrace1.c \n"); /* comment */
59 fprintf(fp, "%d %d\n", width, height);
60 fprintf(fp, "255\n"); /* max pixel value */
61
62 for (j = 0; j < height; j++)
63 for (i = 0; i < width; i++)
64 sx = ((double)i - hw) / hw;
65 sy = ((double)j - hh) / hh;
66 org[0] = sx;
67 org[1] = sy;
68 org[2] = 0.0;
69
70 if (intersect(org, dir))
グローバルイルミネーション入門 15
71 fprintf(fp, "0 0 255 ", i, j);
72 else
73 fprintf(fp, "0 0 0 ", i, j);
74
75
76
77
78 fclose(fp);
79
図 6: raytrace1.c の実行結果
実行すると、図 6 のようなレンダリング結果となる。
6 パストレーシングパストレーシングでは、視点からのレイトレーシングを行なう。レイがサーフェスに当たって反射するときには、1 本のレイのみしか発生させない。そしてレイが光源もしくは背景に当たったときに反射を終了する。つまり全体的に見て、レイのパス (path, 経路)は 1 本のみに限定される。パストレーシングは、Kajiya [12] により、レンダリング方程式の提案と同時にそれを解く手法として一つの論文内で提案された。
グローバルイルミネーション入門 16
6.1 パストレーシング実装では、まずはインポータンス (importance)や確率密度関数 (Probability Density Function, PDF)
などのコトは考えずに、またほとんどの係数やパラメータを決めうちとし、単純な設定でパストレーシングの実装を行なっていこう。サーフェスはすべてディフューズ面とし、カメラの位置やジオメトリの頂点などはワールド座標で指定し座標変換も行なわない。ライトは無限遠の球体としよう。つまりレイがどのオブジェクトにも当たらずに背景に飛んでいく場合に、それをライトに当たったと見なすことにする。まず、レイはカメラから発せられる。カメラの原点からあるピクセルを通ってレイは放たれる
(図 7)。
図 7: さて、どの方向へレイを反射させようか...
うんぬん....レイがディフューズ面に当たったら、ロシアンルーレットでレイをさらに再帰的に反射させて追跡を続けるか、もう追跡を諦めるかをディフューズ反射係数 Kd を用いて決定する。今回 Kd は0.5 とした。
int
russian_roulette()
const double Kd = 0.5; /* 50% reflectivity */
double r;
r = randomMT(); /* Mersenne Twister random number generator */
if (r < Kd) /* accepted */
return 1;
/* rejected */
return 0;
グローバルイルミネーション入門 17
randomMT() は、メルセンヌ・ツイスター法 (Mersenne Twister)12による乱数生成関数であり、[0.0, 1.0) 13の範囲の浮動小数点数を返す。randomMT() の実装は以下のようになる。
#include "mt19937ar-cok.c" /* Mersenne Twister random number generator */
#define randomMT genrand_real2
グローバルイルミネーションでは、乱数の質はレンダリング画像の品質に直接結びつくので優良な乱数生成器を選ぶのは重要である。ただし、今は乱数の質はそれほど問題ではないので、この部分は通常のライブラリ関数である rand(), drand48() などを用いてもよい。
???
図 8: さて、どの方向へレイを反射させようか...
続いて、レイがサーフェスに当たった後、どの方向へ反射したレイを飛ばすかについての戦略を考えよう (図 8)。ディフューズ面は、半球上のどの方向へも光を均一に跳ね返す。つまり半球上のどの方向も等確率でサンプルすればよい。しかし、式...でも判るように、コサインで減衰する。ここはコサインの減衰を考慮して反射方向をサンプルした方が効率がよい。コサインによる減衰も考慮して、ディフューズ面での反射方向をサンプルするコードは以下のようになる。
static void
sample_cosweight(double outdir[3], const double normal[3])
int i;
double r[2];
double cost, sint, phi;
double v[3];
double basis[3][3];
ortho_basis(basis, normal);
r[0] = randomMT();
r[1] = randomMT();
12現在最良の乱数生成アルゴリズムとして知られている手法である。http://これこれ/。ただしその道の研究者に云わせるとほんのちょっと質に問題があるときがあるらしい。
13半開区間であることに注意。つまり 1.0 は含まれない。
グローバルイルミネーション入門 18
cost = sqrt(r[0]);
sint = sqrt(1.0 - r[0]);
phi = 2.0 * M_PI * r[1];
v[0] = cos(phi) * sint;
v[1] = sin(phi) * sint;
v[2] = cost;
/* outdir = Basis . v */
for (i = 0; i < 3; i++)
outdir[i] = v[0] * basis[0][i]
+ v[1] * basis[1][i]
+ v[2] * basis[2][i];
ortho basis() は、法線方向から正規直交基底行列を計算する。つまりはローカル座標での z
方向を法線方向へと合わせるための回転行列である。サンプル点はローカル座標で生成されるので、これを法線方向へと傾かせるために必要となる (図 9)。
図 9: ローカル座標で生成されたサンプル点を、サーフェスの法線方向を z 軸とした空間へ回転させて合わせる。
グローバルイルミネーション入門 19
...
7 双方向パストレーシング双方向パストレーシング (Bi-directional Path Tracing)は、視点からのレイトレーシングと光源
からのライトトレーシングを組み合わせた手法である。双方向パストレーシングは、Lafortune ら[13] と Veach ら [22]によりそれぞれ独立して発表された。双方向パストレーシングでは、視点からのレイトレーシングの利点 (鏡面反射など)とライトトレーシングの利点 (コースティクスなど)の両方を表現することが可能である。...
7.1 ノート双方向パストレーシングは、Lafortune ら [13] と Veach ら [22]によりほぼ同じ時期に異なる学会でそれぞれ独立して発表された。
双方向パストレーシングの文献や、オープンに公開されているコードというのは書籍でも webでもあまり見受けられないように思われる。双方向パストレーシングの理論は、手法の提案者でもある Eric Veach の博士論文の第 10 章で詳細に解説されている。RenderPark は、双方向パストレーシングが実装されている数少ないレンダラであり、そのソースコードが参考になるであろう。Advanced Global Illumination [9]には、双方向パストレーシングのコードフラグメント (コードの一部)が掲載されている。ただしそのコードに対する解説は書中では行なわれていない。
...
8 トーンマッピング現在の CRT モニタや液晶モニタなどのフレームバッファは、色の各要素を [0, 255]の 8 ビット
で表現している (低ダイナミックレンジ)。しかし高ダイナミックレンジ画像は非常に色の表現が広いため、このような 8 ビットのデバイスでは単純に高ダイナミックレンジ画像を表示することはできない。そこで、トーンマッピング (tone mapping)14とよばれる、高ダイナミックレンジ画像を、うまく低ダイナミックレンジデバイスで表示するための手法が必要になる。
8.1 ノートTumblin-Rushmeier トーンマッピングオペレータ [21]は、コンピュータグラフィックスで初めて用いられたトーンマッパーである。
14階調変換とも訳される
グローバルイルミネーション入門 20
8.2 ローカルイルミネーションローカルイルミネーション (local illumination)15アルゴリズムは、サーフェスに直接入射してくる光のみを考慮してシェーディング (色付け)処理を行う。
Zバッファレンダリング [5]、REYESアルゴリズム [6]などの隠面消去アルゴリズムと [1, 4, 11, 19]などの経験的シェーディングモデルとの組み合わせがローカルイルミネーションアルゴリズムの代表である。つまりは現在の GPU ハードウェアで行われている処理の多くがローカルイルミネーションの部類に入る。ローカルイルミネーションでは、光源から直接来る光しか考慮しない。そのためローカルイルミネーションによるレンダリングは非常に高速に行うことができるが、間接光を表現できないので、視覚的に豊かな表現を行うにはデザイナによるアートディレクションが必要になる。また影や遮蔽を表現するには [25, 8]などのアルゴリズムが別途必要になる。また、ローカルイルミネーションの多くで用いられるシェーディングモデルは、コンピュータでの計算に適するように現実世界の観測・経験結果に近似式を当てはめたものである。加えて 0−255などのディスプレイハードウェアに合わせた直感的な単位を用いて照明計算を行うことが多い。そのため物理学に基づいた照明計算を行うように設計されていないことから、物理的に正確なシミューレションが必要なレンダリングにローカルイルミネーションアルゴリズムを用いることは難しい。しかしローカルイルミネーションアルゴリズムは、ライトや物体を動かした時の照明効果の変化を捉えやすく (間接的な照明効果の依存関係がない)、照明値には直感的な単位を用いているので、ライティングや色調をコントロールしやすいという利点がある。そのためスキルのあるアーティストは局所照明アルゴリズムを好む場合もある。現在でも、多くのプロダクションでは局所照明アルゴリズムに基づいたレンダラを用いてレンダリングを行っている。
9 サンプリングとアンチエイリアシングコンピュータグラフィックスは、本質的にサンプリングの問題であると言ってよいだろう。いかにして少ないサンプルで誤差なく目的のレンダリング画像を計算するかがカギとなる。レンダリングにおけるサンプリングの問題は、80 年代にかけて多くの研究が行なわれている。シーンは連続的で無限の周波数を持つ関数であるが、最終的にラスタ型ディスプレイに画像を表示するために、ピクセルの色を決めねばならない。たとえばレイトレーシングは本質的にポイントサンプリングである。そして
9.1 ノート元の信号を復元するには、少なくとも元の信号の周波数の 1/2 以上の周波数でサンプリングする必要がある、というナイキストの定理 (Nyquist theorem)は、Harry Nyquist により [16, 17] で初めて発表され定式化された。... アンチエイリアシングの研究は Mitchell ...
15局所照明とも訳される
グローバルイルミネーション入門 21
10 準モンテカルロ法モンテカルロ (Monte Carlo, MC)法が乱数を用いて積分計算などの問題を解くのに対して、準
モンテカルロ (quasi-Monte Carlo, QMC)法は、低食い違い量列 (low discrepancy sequence)と呼ばれる決定論的 (deterministic)な数列を用いて積分計算を解く手法です。準モンテカルロ法は、低次元の問題においてモンテカルロ法に比べて求めたい値に収束するのが早く (最近では高次元での効率的な準モンテカルロ法も開発されているようです)、また低食い違い量列を求めるコードは乱数を生成するコードよりも単純でハードウェアでの実装に向いているという特徴があります。
aa aaa bbb ccc
ここでは、準モンテカルロ法の数学的な基礎や、各種低食い違い量列の説明と実装を説明し、準モンテカルロ法を実際にコンピュータグラフィックスのレンダリングへの応用について解説します。
準モンテカルロ法は、モンテカルロ法に比べて高速であり少ないサンプル数で同じ品質を実現することができるため、モンテカルロ法を利用している部分を準モンテカルロ法で置き換えることを強く勧めます。本文がその手助けになれば幸いです。以降、問題を簡単にするため、積分の区間は [0, 1]n(nは次元数)の超立方体の中で行うことと仮
定します。
10.1 食い違い度食い違い度 (discrepancy)とは、ある数の集合 PN = x0, . . . , xN−1(N は数の個数、xi は i番目
の数の値)がどれくらい一様に (等しく)分布しているかというのを数学的に測るものさしです。
D∗N (P) = sup
J∗∈Is
∣∣∣∣λ(J ∗) − A(J ∗,P)N
∣∣∣∣
ここで、sは次元数で、J ∗ = [0, u1)× [0, u2)×, . . . ,×[0, un) =∏s
i=1 ui ∈ [0, 1)s = Isになります。このJ ∗はつまり、s次元の超立方体 [0, 1)s内で i次元目の辺の長さが uiである部分空間 (subspace)の取り得るすべての組み合わせを表します。たとえば 2次元の場合、[0, 1)2 = I2 の正方形内に含まれ、[0, u1) × [0, u2)で表されるいろいろな組み合わせの長方形 (ヨコ u1、タテ u2)になります。
ここで注意しておきたいのは、I も J ∗も半開区間であることです (右側が閉じていない)。このことはこの後に J ∗の面積を考えるときに重要になります。
supは、上限 (supremum)を表し、sup f(x)は f(x)が取りうる値のうちで最大 (上限)のものを定義します。supはほとんど maxと似ていますが、maxが定義できないものにも、supが定義できるのがあります。たとえば、f(x) = −1/x2 の関数では、f(x) < 0となりますが、f(x)はゼロにはならないので、max f(x) = 0は定義できませんが、取り得る値の上限が 0ということで、
グローバルイルミネーション入門 22
sup f(x) = 0は定義することができます。
図 10: 大きな正方形は I2 を表す。長い破線の領域に含まれる点の個数は 4個なので、A = 4。短い破線の領域に含まれている点の個数は 3 個なので A = 3
A(J ∗, P は、空間 Isに散らばっている点群 P のうち、部分空間 J ∗に含まれる点の個数を表します (図??を参照)。
λ(J ∗)は J ∗のルベーグ測度 (ルベーグの意味での面積)になります。これはつまり J ∗の面積|J ∗A| =
∏si=1 ui(ここで、
∏は総積記号であり、
∏si=1 ui = uiu2 · · ·unと定義されます)というこ
とになります。なぜここで普通に面積 |J ∗|としないでルベーグ測度で λ(J ∗)とするのでしょうか。それは、J ∗が半開区間であるからです。
結論としては、この場合の半開区間の範囲のルベーグの意味での面積は今までの考えでいう面積と同じであるのですが、より厳密にこの半開区間の面積 (ルベーグ測度)を考えておくことにします。我々が小学校で習った意味での面積は、どちらも閉区間の閉じた範囲において与えられます (図11の右)。たとえば 2次元で考えると、[0, u1]× [0, u2]で囲まれる面積は、ヨコの長さ u1、タテの長さ u2の積、u1u2 になります。しかし、今回の場合 J ∗の張る区間の片方が開区間で閉じていないため (図11の左)、今までの考えでの面積を厳密には与えることができません ([0, u1) × [0, u2)の面積を定義することができない)。しかし、ルベーグ測度という概念で面積というものを考えると、このような閉じていない空間においても面積を与えることができるようになり、[0, u1)×[0, u2)のルベーグ測度はλ([0, u1)×[0, u2)) = u1u2
グローバルイルミネーション入門 23
(a) (b)
図 11: 左: 図形は閉じている。右: 図形の上と右は閉じていない。
となり、閉区間の場合の面積と等しくなります。よって、J ∗のルベーグ測度というのは、J ∗が閉区間の場合の面積 |J ∗|と同等になります。
よって、点群Pの star discrepancy D∗(P)とは、あらゆる yi, i = 1, . . . , nの組み合わせでできる部分空間 Aに含まれる点群 Pの個数を点群の総数 N で割った値と、部分空間の面積 |A|の差が、最も大きくなるときの値、ということになります。
定理 1 もし 0 ≤ x1 ≤ x2 ≤ · · · ≤ xN ≤ 1 であれば、
D∗N (x1, x2, . . . , xN ) =
12N
+ max1≤n≤N
∣∣∣∣xn − 2n − 12N
∣∣∣∣
証明 1 x0 = 0, xn+1 = 1とします。P を点群 x1, . . . , xn とすると、
D∗N (P ) = max
0≤n≤Nsup
xn≤u≤xn+1
∣∣∣∣A([0, u);P )
N− u
∣∣∣∣
= max0≤n≤N
supxn≤u≤xn+1
∣∣∣ n
N− u
∣∣∣
= max0≤n≤N
max(∣∣∣ n
N− xn
∣∣∣ ,∣∣∣ n
N− xn+1
∣∣∣)
= max1≤n≤N
max(∣∣∣ n
N− xn
∣∣∣ ,
∣∣∣∣n − 1
N− xn
∣∣∣∣)
=1
2N+ max
1≤n≤N
∣∣∣∣xn − 2n − 12N
∣∣∣∣ .
ここで、n = A([0, u);P ) は部分空間 Aに含まれる点群 P の個数です。
定理 1 Koksma の不等式 f が [0, 1] で有界変動 Vf をもてば、∣∣∣∣∣
∫ 1
0
f(u) du − 1N
N∑
n=1
f(xn)
∣∣∣∣∣ ≤ V (f)D∗N (S) (3)
が成り立ちます。
グローバルイルミネーション入門 24
証明 1 Koksma の不等式の証明 x1 ≤ x2 ≤ · · · ≤ xN とし、また x0 = 0, xN+1 = 1 とします。式 (3)の右辺の絶対値の中の総和は、summation by parts の公式、
n∑
j=m
ajbj = [Snbn − Sm−1bm] +n−1∑
j=m
Sj(bj − bj+1), SN =N∑
n=1
an.
を用いて、N∑
n=1
f(xn) =N∑
n=1
1 · f(xn)
= [Nf(xN ) − 0 · f(1)] +N−1∑
n=1
n (f(xn) − f(xn+1))
= Nf(xN ) −N−1∑
n=1
n (f(xn+1) − f(xn))
= Nf(xN+1) − N(f(xN+1) − f(xN )) −N−1∑
n=1
n (f(xn+1) − f(xn))
= Nf(xN+1) −N∑
n=1
n (f(xn+1) − f(xn))
= Nf(xN+1) −N∑
n=0
n (f(xn+1) − f(xn))
= Nf(1) −N∑
n=0
n (f(xn+1) − f(xn))
よって、
N
N∑
n=1
f(xn) = f(1) −N∑
n=0
n
N(f(xn+1) − f(xn)) .
右辺の絶対値の中の積分は、部分積分を用いて、∫ 1
0
f(u) du =∫ 1
0
f(u)u′ du
= [f(u)u]10 −∫ 1
0
f ′(u)u du
= f(1) −∫ 1
0
udf(u)du
du
= f(1) −∫ 1
0
u df(u)
になります。よって、式 (3)の右辺の絶対値の中は、∫ 1
0
f(u) du − 1N
N∑
n=1
f(xn) =(
f(1) −∫ 1
0
u df(u))−
(f(1) −
N∑
n=0
n
N(f(xn+1) − f(xn))
)
=∫ 1
0
u df(u) −N∑
n=0
n
N(f(xn+1) − f(xn))
グローバルイルミネーション入門 25
となり、ここで、 ∫ 1
0
u df(u) =N∑
n=0
∫ xn+1
xn
u df(u),
および、f(xn+1) − f(xn) = [f(u)]xn+1
xn=
∫ xn+1
xn
1 df(u),
を用いて整理することで、∫ 1
0
f(u) du − 1N
N∑
n=1
f(xn) =N∑
n=0
∫ xn+1
xn
(u − n
N
)df(u)
=N∑
n=0
∫ xn+1
xn
u − n
Ndf(u).
となります。
定理 (1)から (2行目に注目)、0 ≤ n ≤ N となる固定された n および各 xn ≤ uxn+1 に対して、∣∣∣u − n
N
∣∣∣ ≤ D∗N (x1, . . . , xn)
が成り立つので、N∑
n=0
∫ xn+1
xn
∣∣∣u − n
N
∣∣∣ df(u) ≤N∑
n=0
∫ xn+1
xn
D∗N df(u)
= D∗N
N∑
n=0
∫ xn+1
xn
1 df(u)
= D∗N
N∑
n=0
(f(xn+1) − f(xn))
また、有界変動 V (f)は、
V (f) = supI
N∑
∆J=∈I,i=0
(f(xi + ∆) − f(xi))
で定義されていることにより (J は I をあらゆる分割方法の可能性により分割した領域とし、その分割数を N、その幅を∆とする)、
N∑
n=0
(f(xn+1) − f(xn)) ≤ V (f)
となるので (この不等式は、右辺はN個の荒い分割で測った変動量であるのに対し、左辺はより精細な間隔で測った上にその最大 (上限)を取った変動量であることをイメージすれば、理解し易いと思います)、よって最終的に、
∣∣∣∣∣
∫ 1
0
f(u) du − 1N
N∑
n=1
f(xn)
∣∣∣∣∣ ≤ D∗N
N∑
n=0
(f(xn+1) − f(xn)
≤ V (f)D∗N
となります。
グローバルイルミネーション入門 26
10.1.1 k次元の場合
定理 1 Koksma-Hlawka の不等式 f が [0, 1]k で、Hardy-Krause の意味での有界変動 (the vari-ation in the sense of Hardy-Krause)16 Vf をもてば、
∣∣∣∣∣
∫
[0,1]kf(x) dx − 1
N
N∑
n=1
f(xn)
∣∣∣∣∣ ≤ VfD∗N (S)
が成り立ちます。
...
10.2 Hardy-Klause の意味での有界変動Hardy-Klause の意味での有界変動は、Vitali の意味での有界変動 (the variation in the sense of
Vitali)から導きだされます。
10.3 Vitali の意味での有界変動関数がどれくらい変化しているか (どれくらい起伏の程度があるか)を測った量を変動量 (varia-
tion)と呼びます。変動量が有限の値である (無限にならない)とき、これを有界変動と呼びます。たとえば、y = 3のような関数は全く起伏がないので、変動量はゼロになります。
10.4 一様格子分布 (regular grid, uniform grid)
空間を一様に分布する配置として、通常我々は空間を一様の大きさに分割するような点の配置が思い浮かぶと思います。たとえば一次元の場合、サンプル点が N 個、一様格子分布にもとづいた数列を Puniform とすると、
Puniform =0N
,1N
, . . . ,N − 1
N
となる数列です。直感的に考えて、一様格子分布は、一様に分布しているのだから最も食い違い度が低い数列ではないのかと思ってしまいますが、実際に食い違い度を測るとそうでないことが分かります。一様格子分布のスター食い違い度は、
D∗uniform = O(frac1N
1s )
になります17。ここで s は次元数です。つまり一次元に限れば、一様格子分布のスター食い違い度は O(1/N) になるので O(logs N/N) となるような低食い違い列よりも勝ることがありますが、一様格子分布のスター食い違い度は次元数が増えるほど次元爆発 (dimensional explosion)が起こり大きくなってしまうのが分かります。
16この説明17これの証明
グローバルイルミネーション入門 27
10.5 一様分布乱数列 (uniformly distributed random series)
モンテカルロ法では、次元爆発を避けるために乱数を用いました。これは、スター食い違い度を測ることで確認するこができます。一様分布乱数列 D∗
random のスター食い違い度は、
D∗random = O
(log log N
2N
)
になります (確率 1 で)。
証明 一様に分布している乱数列 xi から、以下により新しい乱数 ξi を定義します。
ξi =
a 2c 4
もし xi が [0, 1) で一様に分布しているのであれば、 ξi の期待値と分散は、
E(ξi) = λ(A), V 2(ξi) = λ(A) − λ(A)2 ≤ 14
ここで λ(A) は A のルベーグ測度 (ルベーグの意味での面積)です。もし xi が独立乱数であれば、生成される ξ1, ξ2, . . . , ξN 乱数もまた独立になり、期待値 E(ξ)と分散 V (ξ)をもつ等しい分布になります。
10.6 van der Corput列低食い違い量列は、根基逆関数 (radical inverse function)を元にして生成します。1810進法の整数 n を、b 進法 ( b ≥ 2 ) で表し、このときの j + 1 桁目の数字を aj(n) とします (式の定義がj = 0から始まるのですが、日本語で 0 桁目というのは変なので j + 1 桁目という表現を使いました)。すると、10進法での n は、
n =∞∑
j=0
aj(n)bj
で表すことができます。たとえば 10 進数での 6 は 2 進数で表すと 110 になるので、 a(0) =0, a(1) = 1, a(2) = 1 になります。このとき、基数 b の根基逆関数は、以下で定義されます。
Φb(n) =∞∑
j=0
aj(n)b−j−1
つまり、b 進法での Φb(n) は、 n を小数点で対称に折り返したものになります。また、n ≥ 0 のすべての整数 n で Φb(n) ∈ [0, 1) になるという性質があります。図 2 に基数 2 のときの van derCorput 列を示します。
18vandercorput 列のオリジナルの論文
グローバルイルミネーション入門 28
n 2進法での Φ2(n) 10進法での Φ2(n)
0 0 0.0001 0.1 0.5002 0.01 0.2503 0.11 0.7504 0.001 0.1255 0.101 0.6256 0.011 0.3757 0.111 0.875
表 2: 基数 2 の van der Corput 列
10.7 Halton 列Halton 列では、van der Corput 列を次元数分並べたベクトルになります19。s 次元の Halton
列は、以下のように定義されます。
xsn = (Φb1(n),Φb2(n), . . . ,Φbs−1(n))
このとき、根基逆関数の bi には重ならない素数を使います。例えば 2 次元で、 b1 = 2, b2 = 3 とした時の、 Halton 列を表 3 に示します。1 次元の Halton 列というのは、 van der Corput 列と同じです。
n 2進法での Φ2(n) 3 進法での Φ3(n) (Φ2(n),Φ3(n))
0 0 0 (0.000, 0)1 0.1 0.1 (0.500, 1/3)2 0.01 0.2 (0.250, 2/3)3 0.11 0.01 (0.750, 1/9)4 0.001 0.11 (0.125, 4/9)5 0.101 0.21 (0.625, 7/9)6 0.011 0.001 (0.375, 1/27)7 0.111 0.101 (0.875, 10/27)
表 3: 2 次元の Halton 列 (b1 = 2, b2 = 3)
19halton 列の論文
グローバルイルミネーション入門 29
10.8 Hammersley 列Hammersley 列は、 第一次元の要素を n/N (N は生成するサンプル数。 n ≤ N − 1) にする以
外は、Halton 列と似ています20。
xsn = (n/N, Φb1(n),Φb2(n), . . . ,Φbs−2(n))
Hammersley 列は、N に依存するので、前もって生成するサンプル数が決定されていなくてはならないという欠点があります。その点、 van der Corput 列や Halton 列は、N に依存しないので、インクリメンタルに計算を行うことができます。その代わり、Hammersley 列は、 Halton 列よりも少しよいスター食い違い度を持ちます。
Hammersley 列で最も特徴的な点の並び方は、2 次元の時で基数が b1 = 1 、かつ生成するサンプル数が N2 のときです。このときのみ、 Hammersley 列の点群は、空間 N で等分してできる格子上に置かれることになります。
n n/N 2進法での Φ2(n) (n/N, Φ2(n))
0 0/8 0/8 (0 , 0.000)1 1/8 0.1 (1/8, 0.500)2 2/8 0.01 (2/8, 0.250)3 3/8 0.11 (3/8, 0.750)4 4/8 0.001 (4/8, 0.125)5 5/8 0.101 (5/8, 0.625)6 6/8 0.011 (6/8, 0.375)7 7/8 0.111 (8/8, 0.875)
表 4: N = 8 のときの 2 次元の Hammersley 列 (b1 = 2)
準モンテカルロ法はとくに金融工学の分野で広く用いられています.
10.9 ノート準モンテカルロの研究は、Harald Niederreiter 博士が多大なる貢献をしている。[14] は、この分野におけるバイブルとも云える書籍である。
有限体理論からの低食い違い量列 多くの低食い違い量列は、 Faure 列 ( Faure sequence) を元に生成されてきましたが、 Niederreiter 氏と Xing 氏により、有限体 (finite field)に基づいた全く新しい低食い違い列である Niederreiter-Xing 列 (Niederreiter-Xing sequence, NX 列)[26] が考案されました。
NX 列は、既存の LDS の中でもかなり優秀なもののようで、それなりの高次元でも使えるようです。
NX 列の実装は [1] で入手することができます。
20hammersley の論文
グローバルイルミネーション入門 30
この NX 列の理論の元になっている有限体とは、足したり掛けたりの演算を行っても有限の位数 (要素数)しか取りえない世界 (体)のことです。有限で閉じているので、コンピュータでの演算に適しており、実際有限体は楕円曲線、暗号、符号理論、低食い違い量列などと幅広く応用されているようです。
10.10 一様分布以外の生成
参考文献[1] 湯前祥二, 鈴木輝好著, モンテカルロ法の金融工学への応用
[2] Alexander Keller, Strictly Deterministic Sampling Methods in Computer Graphics, (mentalimages technical report, 2001) in ”Monte Carlo Ray Tracing”, SIGGRAPH ’2003 Course44, San Diego, July, 2003.
[3] T. Wong, W. Luk, and P. Heng, Sampling with Hammersley and Halton points, Journal ofGraphics Tools, vol. 2, no. 2, pp. 9-24, 1997
11 数学的予備知識11.1 放射測定11.1.1 放射輝度
コンピュータグラフィックスにおいて、放射輝度はもっとも重要な単位である。なぜなら、放射輝度はレンダリングされる画像のピクセル値と直接に対応するものであるからである。
11.1.2 測度論的放射輝度
測度論からのアプローチによる放射輝度の扱いは
11.2 ノート放射測定については、 Nicodemus が先駆者であり多大なる仕事をしている。Nicodemus による放射測定の仕事は、NIST((米国)標準技術局) から [?] にまとめられている。放射測定の考えは、Kajiya がレンダリング方程式 [12] を導出するためにコンピュータグラフィックスの分野に初めて導入された。
11.3 随伴法通常、光のシミュレーションというと、フォトン (光子)を光源から放出し、サーフェスで反射
し、最終的にカメラやフィルム面などの検出器 (detector)へと飛び込んでくる光の経路をシミュ
グローバルイルミネーション入門 31
レーションする。しかし、レイトレーシングなどで見てきたように、カメラから光源へと逆方向の流れで光の経路を計算しても同じ結果が得られる。この対称性を数学的に記述し証明するのが、随伴法 (Adjoint method)である。
11.4 インポータンスサンプリングインポータンスサンプリング (importance sampling)21は、結果への寄与が大きい重要な (important)
部分を、集中的にサンプリングする手法である。グローバルイルミネーションなど、サンプリングの問題へと帰着することの多いコンピュータグラフィックスの分野では、インポータンスサンプリングは重要な概念である。なぜならより少ないサンプル数で、より正確なレンダリング結果を得ることができるからである。
便宜を図るため、d 次元超立方体 [0, 1)d での積分
I =∫
[0,1)d
f(x) dx
を考えよう22。これは、適当な関数 p(x) を用いて、
I =∫
f(x)p(x)
p(x)dx
と変形して表現することもできる。ここで、p(x) は [0, 1)d 上で定義される確率密度関数 (prob-ability density function, PDF)とすると、我々が示したいことが容易になる。p(x) から独立してサンプルされた Xi を用いた I のモンテカルロ推定 I は
I =1n
n∑
i=1
f(Xi)p(Xi)
となる。
11.4.1 ノート
インポータンスサンプリングに関する統括的な解説かつ奥深い洞察については、Owen らの [18]が参考になるだろう。
11.5 ロシアンルーレットロシアンルーレットのコンピュータグラフィックスへの導入は、Arvo ら [3]により初めて行なわれた。一次元の積分
21加重サンプリング、重点的サンプリング、要点抽出法などとも訳される22変数変換や区間の写像を行なえば、多くの積分はこの形式で表現することができる
グローバルイルミネーション入門 32
I =∫ 1
0
f(x)dx
を考えよう。ここで f を水平方向に P でスケーリングし、垂直方向に 1/P でスケーリングすることを考える (P ≤ 1)。このときの積分値 Irr は、
Irr =∫ P
0
1P
f(x
P)dx
となる。I = Irr...ロシアンルーレットによる、分散の評価は、... が行なっている。
11.6 レンダリング方程式3D CG におけるレンダリングの照明計算式は、レンダリング方程式 [12]で定式化を行うことができる。サーフェス上のある点 x から、方向 ω へと出射していく放射輝度 L(x, ω) は以下のように定義される [12]。
L(x, ω) = Le(x, ω) +∫
Ω
L(x, ω′)f(ω, ω′) cos θ dω′ (4)
ここで積分区間 Ω は、サーフェス上の点 x の法線方向の半球になる。dω′ は微小立体角であり、これは球座標 (θ, φ)で示すと sin θdθdφ となる。f は点 x での BRDF (Bidirectional ReflectanceDistribution Function、双方向反射分布関数)、cos θ の θ は点 x の法線と ω′ との角度である。Le(x, ω) はサーフェスから発光する放射輝度で、これは通常光源となるサーフェスでのみ非ゼロになる。この式は図 12 で図示することができる。
= +
図 12: Illustration of the rendering equation.
つまりこの積分の示すところは、ある点からある方向へと出射する放射輝度は、法線方向の半球にあらゆる方向から入射してくる放射輝度に BRDF 積を掛けたものの積分を取るということを示している。式 (4)は、積分演算子23 T を用いて、
L = Le + T L (5)
と簡潔に表記する事ができる。ここで T は、
23operator の訳語は物理学分野では演算子、数学分野では作用素と訳される。ここでは物理学の方を用いることにした
グローバルイルミネーション入門 33
(T L)(x, ω′) :=∫
Ω
L(x, ω′)f(ω, ω′) cos θ dω′
と定義される。式 (5) は両辺に L があるためそのままでは評価を行うことができない。レンダリング方程式は第二種フレッドホルム積分方程式として捉えることができる。エネルギー保存則が成り立つとすれば、積分演算子のノルムは |T | < 1 と仮定できるので、式 (5) にノイマン級数展開 1
1−z =1 + z + z2 + · · · =
∑∞i=0 zi (z < 1)24を適用し,
L = Le + T Le + T (T Le) + · · · =∞∑
i=0
T iLe (6)
を得る。これにより右辺は未知関数 L の代わりに既知関数 Le で置き換えられるので、 i を適当な次数で打ち切ることで L の評価を行うことができる。
12 参考書籍ここでは、グローバルイルミネーションを知る・学ぶ上で有益な書籍を紹介したいと思う。Advanced
Global Illumination12.
24つまりは初項 1, 公比 z の等比級数の公式である
グローバルイルミネーション入門 34
解析概論。別名高木本。古典的な初等数学の入門書。世の大学の数学科の学生は必携だとか。
グローバルイルミネーション入門 35
参考文献[1] Arthur Appel. The notion of quantitative invisibility and the machine rendering of solids.
In Proceedings of ACM National Conference, pages 387–393, 1967.
[2] Arthur Appel. Some techniques for shading machine renderings of solids. In Proceedings ofthe Spring Joint Computer Conference, pages 37–45, 1968.
[3] James Arvo and David Kirk. Particle transport and image synthesis. In Computer Graphics(SIGGRAPH ’90 Proceedings), pages 63–66, 1990.
[4] W. Jack Bouknight. A procedure for generation of three-dimensional half-toned computergraphics presentations. Communications of the ACM, 13(9):527–536, 1970.
[5] Edwin E. Catmull. A Subdivision Algorithm for Computer Display of Curved Surfaces. PhDthesis, Dept. of CS, U. of Utah, December 1974.
[6] R. Cook, L. Carpenter, and E. Catmull. The reyes image rendering architecture. In Pro-ceedings of SIGGRAPH 1987, pages 95–102, 1987.
[7] Robert L. Cook. Shade trees. In Proceedings of SIGGRAPH 1984, pages 223–231, 1984.
[8] Franklin C. Crow. Shadow algorithms for computer graphics. Computer Graphics (SIG-GRAPH ’77 Proceedings), 11(2):242–248, July 1977.
[9] Philip Dutre, Philippe Bekaert, and Kabita Bala. Advanced Global Illumination. A.K. PetersLtd., 2003.
[10] Cindy M. Goral, Kenneth E. Torrance, Donald P. Greenberg, and Bennett Battaile. Mod-eling the interaction of light between diffuse surfaces. In Proceedings of SIGGRAPH 1984,pages 213–222, 1984.
[11] Henri Gouraud. Continuous shading of curved surfaces. IEEE Transactions on Computers,20(6):623–628, 1971.
[12] James T. Kajiya. The rendering equation. In Proceedings of SIGGRAPH 1986, volume20(4), pages 143–150, 1986.
[13] Eric P. Lafortune and Yves. D. Willims. Bi-directional path tracing. In Third InternationalConference on Computational Graphics and Visualization Techniques(Compugraphics ’93),pages 145–153, December 1993.
[14] Harald Niederreiter. Random Number Generation and Quasi-Monte Carlo Methods.Philadelphia, Pa. : Society for Industrial and Applied Mathematics, 1992.
[15] Tomoyuki Nishita and Eihachiro Nakamae. Continuous tone representation of 3-d objectstaking account of shadows and interreflection. Computer Graphics (SIGGRAPH ’85 Pro-ceedings), 19(3):23–30, July 1985.
グローバルイルミネーション入門 36
[16] Harry Nyquist. Certain factors affecting telegraph speed. Bell System Technical Journal,page 324, 1924.
[17] Harry Nyquist. Certain topics in telegraph transmission theory. A.I.E.E. Trans., 47:617,1928.
[18] Art B. Owen and Yi Zhou. Safe and effective importance sampling. volume 000, pages00–00, 1998.
[19] Bui-T. Phong. Illumination for computer generated pictures. Communications of the ACM,18(6):311–317, June 1975.
[20] Peter-Pike Sloan, Jan Kautz, and John Snyder. Precomputed radiance transfer for real-timerendering in dynamic, low-frequency lighting environments. In Proceedings of SIGGRAPH2002, pages 527–536, 2002.
[21] J Tumblin and H. E. Rushmeier. Tone reproduction for realistic images. volume 13, pages42–48, 1996.
[22] Eric Veach. Bidirectional estimators for light transport. In Fifth Eurographics Workshopon Rendering, pages 147–162, June 1994.
[23] Eric Veach. Non-symmetric scattering in light transport algorithms. In Eurographics Ren-dering Workshop 1996 Proceedings, pages 82–91, June 1996.
[24] Turner Whitted. An improved illumination model for shaded display. Communications ofthe ACM, 23(6):343–349, 1980.
[25] Lance Williams. Casting curved shadows on curved surfaces. In Computer Graphics (SIG-GRAPH ’78 Proceedings), volume 12, pages 270–274, August 1978.
[26] Chaoping Xing and Harald Niederreiter. A construction of low-discrepancy sequences usingglobal function fields. volume 73, pages 87–102, 1995.
グローバルイルミネーション入門 37
索 引確率密度関数, 17クラシックレイトレーシング, 4グローバルイルミネーション, 1双方向パストレーシング, 20めとろぽりすひかりゆそう, 7メルセンヌ・ツイスター, 18レイキャスティング, 4レイトレーシング, 4ローカルイルミネーション, 21
38
13 更新履歴• 2004 年 7 月 30 日
– レイトレーシング実装の節を追加
• 2004 年 7 月 6 日
– 放射測定の節を追加
– 準モンテカルロ法:ノートを加筆
• 2004 年 7 月 5 日
– アルゴリズムの歴史を加筆
• 2004 年 7 月 4 日
– プログラミングツールと準備の節を追加
• 2004 年 7 月 1 日
– 準モンテカルロ法の節を追加 (今まで書きかけだったのをマージ)。
– フッターを追加。
• 2004 年 6 月 29 日
– 参考書籍の節を追加。
– 更新履歴を取リ始める。
グローバルイルミネーション入門 39