前回オリジナルLLVMバックエンドを使ってレイトレーシングのプログラムをコンパイルして動かしたのだが、実は「レイトレーシングとは何なのか」良く知らない。コンピュータグラフィックスの授業などは殆ど取ったことが無く、これまでの経験でも使用することが無かったため良く分からない。そこで資料を読んで勉強してみることにした。
- Introduction to Ray Tracing: a Simple Method for Creating 3D Images
https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing
参考にしたのはまさにレイトレーシングのプログラムを拝借してきたサイトから。レイトレーシングのアルゴリズムを丁寧に解説してある。これを読んでみよう。 結構長いのでしっかりGoogle Translateに活躍してもらった。Google Translateの結果を読みながら、要点をつまみ出していく。
また、画像も分かりやすいので本文中から引用させて頂いた。
今回は "How does it work? " と "Raytracing Algorithm in a Nutshell " の2節の要点をまとめた。
Introduction to Ray Tracing: a Simple Method for Creating 3D Images を読む
レイトレーシング:3次元のシーンを2次元画像に投影する方法。
レイトレーシングはどのように動くのか
レイトレーシングが画像を生成する方法:
画像はもちろん2次元の平面上に作成されるのだが、この画像を生成するために何が必要かを考えてみる。まずはイメージプレーン。これは画家が使用するキャンバスと考えて良い。始点は目の中心にあり、高さは視線の平行になる。ここでピラミッドとして切り取っているのは、奥行きを持たせるためだろうか?
透視投影
キャンバスにりっぽ遺体を描画する場合、まずやってみることとして8つの頂点を、目(Vantage Point)までの線を引いてみる。そしてその線がキャンバスと交差する場所を見つける。これをすべての立方体のエッジに対して行うとキャンバス上に図形を描くことができる。
光と色
3次元物体を2次元キャンバスに投影する方法が分かったら、次は色を追加する。色についてどのように考えるかだが、物体の色と明るさをどのように決めるかというと、それはオブジェクトのマテリアルと相互作用するライトから算出される。光はフォトン(電磁粒子)から構成されている。
講師が物体に当たると、3つのことが発生する。吸収・反射・透過である。そしてこれらが発生するフォトンの割合は物体のマテリアルによって異なる。しかし常に「入射フォトンの総数は、反射・吸収・透過したフォトンの合計と一致する」と言える。
物体は複合材料または多層材料から構成されることもあり、例えば不透明な物体(木材など)の上にニスの透明なコーティングを行うこともできる。
今のところは不透明で拡散した物体を考えてみる。物体の「色」というのは、フォトンを吸収するプロセスが決定するものである。白色光には「赤」「青」「緑」の講師が含まれており、吸収プロセスは「青」「緑」のフォトンをフィルタリング、もしくは吸収する。そして赤いフォトンは反射され、色が赤く見える。そして、この赤いフォトンが私たちの目に到達することによって認識される。
レイトレーシングアルゴリズムの概要
つまり、私たちは「光が無ければ何も見えない」と言うことが分かる。そして「環境内に物体が無いと光が見えない」と言うことが分かる。
フォワードトレース
コンピュータで生成された画像デライトと物体の相互作用プロセスをシミュレーションする場合、気をつけなければならないのは、物体によって反射させれる光線のうち、わずかな光線のみが綿たちの目に到達するということである。光源が1つあったとして、そのフォトンは物体に当たり、フォトンはランダムの方向に反射させる。
これをコンピュータグラフィックスの視点で考えると、放出されたフォトンは物体にぶつかり反射しながらイメージプレーン上のピクセルに当たり、そこで色を形成する。この処理をすべてのイメージプレーン内のピクセルで色が生成されるまで行い、画像が生成される。この手法では、光源から観測者まで前方にフォトンの経路をたどるためフォワードトレース(前方光線追跡)と呼ばれる。
この方式の問題は、実際には光線はすべての方向に反射するため、目に当たる可能性のあるフォトンは非常にわずかであり、非常に多くのフォトンを放射しなければならないという点である。
この方式を採用した場合、画像が生成されるプロセスを追ってみると、まるでフォトンでオブジェクトの表面をスプレーしているかのように見える。スプレーの密度が十分でない場合、領域を均一に照らすことができない。
つまり、フォワードトレースで画像を生成する場合、十分な数のフォトンを放射して性格に物体を表現できていると判断できるまでプログラムをひたすら実行することになる。これはコスト的にも、画像の品質を決めるのにも不向きである。つまり、実用的ではないという結論に到達する。
バックワードトレーシング
そこで、光源からレセプター(目など)に光線を追跡するのではなく、レセプターから物体まで逆方向に光線を追跡する。これをバックワードトレーシング(Backward Tracing)と呼ぶ。光線が物体に当たると、当たった場所から環境のライトに向けて別の光線を投射することによって物体が受け取る光の量を計算できる。
この光線が環境の別の物体によってさえぎられる場合がある。これは光線の当たる場所が下限になっていることを意味し、この場合は光源からの光を受け取らない。このため、これらの光線には影光線という名前が付けられている。