レイトレーシング — 光を逆向きにたどる
カメラから画素ごとに光線(レイ)を発射し、物体との交差を調べて色を決める。ラスタライズでは特別な追加テクニックが必要だった影・反射が、レイトレーシングでは同じ1つの仕組みから自然に生まれることを、1本のレイの旅と、本物に動くミニレイトレーサで確かめます。
1. 発想の転換 — 光線を「逆向き」にたどる
現実の世界では、光源から出た光が物体で跳ね返り、最後に目(カメラ)へ届きます。しかし光源から出る光線の大部分はカメラに届かずに終わるので、光源側から素直にシミュレーションすると計算のほとんどが無駄になります。そこで視点から画素を通して逆向きにレイを飛ばし、「この画素に届く光はどこから来たのか」を遡るのがレイトレーシングです。
下のデモは1画素ずつの処理の中身です。① 一次レイ → ② 影レイ → ③ 反射レイの3段階が終わると、左のスクリーンにその画素の色が1つ確定します。
2. 交差判定 — レイトレーシングの心臓部
計算時間のほとんどは「レイが何に・どこで当たるか」の判定に使われます。もっとも基本の相手は球。球面の式 |P − C|² = r² にレイの式を代入すると t の2次方程式になり、判別式の符号で「当たるかどうか」、最小の正の根で「最初に当たる場所」が分かります。
下は本物のレイトレーサです。160×90 の低解像度で、全画素について一次レイ・影レイ・反射レイ(深さ2)を実際に計算しています。
3. 影は「おまけ」で手に入る
ヒット点から光源へ影レイ(シャドウレイ)を1本飛ばし、途中に遮る物があるかだけを調べます。遮られていればその光源からの直接光は 0。ラスタライズのシャドウマップのような別パスも解像度の悩みもなく、交差判定そのものが影の判定になります。
4. 鏡の中の鏡 — 再帰する反射
鏡面にヒットしたら、反射方向へ新しいレイを飛ばし、その結果の色を混ぜます。反射先がまた鏡面なら、そこからさらに反射レイ…と再帰が続くので、実装では最大反射回数(深さ)で必ず打ち切ります。
5. まとめ
- 一次レイ:視点から画素方向へ。最初にぶつかった物体がその画素に写る。
- 影レイ:ヒット点から光源へ。遮蔽の有無を調べるだけで正確な影になる。
- 反射レイ:鏡面では再帰的に追跡。深さの上限で打ち切る。
- Whitted 型は硬い影と完全鏡面まで。拡散面の間接光は次のパストレーシングで。