はじめに

私が長年にわたって担当しているコンピューターグラフィックスの講義では、レイトレーシングを扱うことが多い。レイトレーシングでは全てのコードを自分で書く必要があるが、外部 API を使わずにクールな画像を生成できるからだ。その講義ために作ったノートをここに書籍としてまとめることにした。この本の目的はクールなプログラムをなるべく簡潔に読者へ示すことである。出来上がるのは機能全部載せのレイトレーサーとはいかないが、映画でレイトレーシングが使われる主な理由の一つである間接光がサポートされる。この本のステップ通りに実装していけば、レイトレーサーのアーキテクチャは簡単に拡張できるものになる。レイトレーシングにさらに興味が湧いた場合にも勉強に役立つだろう。

「レイトレーシング」という言葉は人によって様々な意味で使われる。この本で私が解説するのは正確には「パストレーサー」であり、それもかなり一般的なものである。「仕事はコンピューターにさせよう」ということでコードは非常に簡単だが、それでも生成される画像には十分満足してもらえると思う。

これからレイトレーサーを書く方法を私が書く順番通りに、デバッグのコツを交えながら示していく。最後まで読めば、素晴らしい画像を生成するレイトレーサーが手に入るだろう。この本は週末で読み切れると思うが、それより長くかかっても気にすることはない。言語は C++ を使う。他の言語を使っても構わないものの、私は C++ を勧める。C++ は高速かつポータブルで、プロダクションムービーやゲームのレンダラの多くが使っている言語でもあるからだ。C++ の「モダンな」機能は使わないようにしたが、レイトレーサーで特に活躍するオペレーターのオーバーロードと継承は使った。ソースコードをオンラインで入手できるようにはしていないものの、コードは本物であり、vec3 クラスの簡単なオペレーターの一部を除いて全て本文中に示される。私はコードを学ぶには自分でそのコードをタイプするべきだと強く信じているが、どこかから利用可能だとそれを使ってしまう。つまり私が自分の教えを実践できるのはコードが入手できないときだけだ。というわけで、ソースコードを公開してくれなどと言わないように!

(一つ前の段落の最後の部分は私が実際にしたことと 180° 違って面白いので、意図的に残してある。入り組んだバグに遭遇した読者には見比べるためのコードが役立つようだ。コードはぜひ自分でタイプしてほしいと思っているが、もし私のコードが見たいなら https://github.com/RayTracing/raytracing.github.io/ から入手できる)

この本はベクトルの基礎的な事項 (ベクトル同士の内積や加算など) を知っている読者を想定している。もし知らないなら、簡単に勉強しておくべきだろう。ベクトルの学習・復習には、Marchener と私が書いた Fundamentals of Computer Graphics, Foley, Van Dam, et al. によるComputer Graphics: Principles and Practice, あるいは McGuire の graphics codex を見てみるとよい1

何か問題が起きたり、クールな画像ができて誰かに見せたくなったときは ptrshrl@gmail.com までメールしてほしい。

この本に関連する書籍やリンクをブログ https://in1weekend.blogspot.com/ にまとめている。

このプロジェクトに手を貸してくれた全ての人に感謝する。名前は巻末の謝辞にある。

では始めよう!


  1. 訳注: Computer Graphics: Principles and Practice の第一版には邦訳 (コンピュータグラフィックス 理論と実践, 佐藤 義雄 監訳, オーム社) がある。他の本に邦訳はない。[return]

広告