レイトレーシング — 光を逆向きにたどる

カメラから画素ごとに光線(レイ)を発射し、物体との交差を調べて色を決める。ラスタライズでは特別な追加テクニックが必要だった影・反射が、レイトレーシングでは同じ1つの仕組みから自然に生まれることを、1本のレイの旅と、本物に動くミニレイトレーサで確かめます。

1. 発想の転換 — 光線を「逆向き」にたどる

現実の世界では、光源から出た光が物体で跳ね返り、最後に目(カメラ)へ届きます。しかし光源から出る光線の大部分はカメラに届かずに終わるので、光源側から素直にシミュレーションすると計算のほとんどが無駄になります。そこで視点から画素を通して逆向きにレイを飛ばし、「この画素に届く光はどこから来たのか」を遡るのがレイトレーシングです。

下のデモは1画素ずつの処理の中身です。① 一次レイ → ② 影レイ → ③ 反射レイの3段階が終わると、左のスクリーンにその画素の色が1つ確定します。

1本のレイの旅 — 画素の色が決まるまで
白い線=一次レイ(視点→画素方向)、黄色の点線=影レイ(光源が見えるかの確認。遮られると赤く ✖)、水色=反射レイ(鏡面のみ)。画素ごとにこの手順を繰り返すと、左の縦一列(スクリーン)に絵が埋まっていきます。
POINT — 逆向きにたどっても答えは同じ 光の経路は逆向きにたどっても物理的に等価(ヘルムホルツの相反性)。だから「カメラに届く経路だけ」を画素起点で選んで計算でき、これがレイトレーシングの効率の源泉になっている。
P(t) = O + t·D  (t > 0) レイは始点 O と単位方向 D の半直線。交差判定は「P(t) が物体表面に乗る t を解く」こと

2. 交差判定 — レイトレーシングの心臓部

計算時間のほとんどは「レイが何に・どこで当たるか」の判定に使われます。もっとも基本の相手は球。球面の式 |P − C|² = r² にレイの式を代入すると t の2次方程式になり、判別式の符号で「当たるかどうか」、最小の正の根で「最初に当たる場所」が分かります。

t2 − 2(D·(C−O)) t + |C−O|2 − r2 = 0 判別式が負なら外れ。最小の正の根が最初のヒット(|D| = 1 とした)

下は本物のレイトレーサです。160×90 の低解像度で、全画素について一次レイ・影レイ・反射レイ(深さ2)を実際に計算しています。

ミニレイトレーサ — 球・市松の床・空を描く
スライダーを動かすと上の行から再レンダリングが走ります。影の向き・ハイライト・鏡面球への映り込み・空の太陽がすべて同じレイの仕組みから一斉に追従することに注目してください。

3. 影は「おまけ」で手に入る

ヒット点から光源へ影レイ(シャドウレイ)を1本飛ばし、途中に遮る物があるかだけを調べます。遮られていればその光源からの直接光は 0。ラスタライズのシャドウマップのような別パスも解像度の悩みもなく、交差判定そのものが影の判定になります。

影レイの判定 — 届けば明るく、遮られれば影
床の各点から光源へ影レイを飛ばし、緑=届いた(明るい)/赤=遮られた(影)。点光源なので影の輪郭はくっきりした本影のみ。光源に大きさ(面積)を持たせると、半分だけ遮られる領域=半影が生まれます。
注意 — 「レイトレーシング=フォトリアル」ではない ここで扱った古典的な Whitted 型レイトレーシング(1980)は、点光源の硬い影と完全鏡面の反射・屈折しか表現できない。拡散面どうしが光を運び合う間接光(白い壁で跳ねた光が影の中を照らす効果)は運べないため、写実の完成には次のレッスンのパストレーシングが必要になる。

4. 鏡の中の鏡 — 再帰する反射

鏡面にヒットしたら、反射方向へ新しいレイを飛ばし、その結果の色を混ぜます。反射先がまた鏡面なら、そこからさらに反射レイ…と再帰が続くので、実装では最大反射回数(深さ)で必ず打ち切ります。

R = D − 2(N·D) N 入射方向 D と法線 N から反射方向 R を作る。屈折レイも同様にスネルの法則から方向を決める
反射の深さ — 何回まで跳ね返りを追うか
向かい合う2つの鏡面球。0回=映り込みなし(ただの灰色の球)、1回=相手の球と床が映る、2回以上=映った球の中にさらに自分が映る「合わせ鏡」が深くなります。画像はスライダー変更時のみ再計算しています。
一歩先へ — 現代のリアルタイムレイトレーシング 交差判定を高速化する主役が BVH(物体を入れ子の箱で包む階層構造。候補を対数時間で絞り込む)。GPU の RT コアはこの BVH 走査と三角形交差を専用回路で処理する。それでもリアルタイムでは1画素あたり数本のレイしか撃てないため、実際のゲームはラスタライズと組み合わせたハイブリッドで、足りないサンプルはデノイザで補うのが主流。

5. まとめ