本日はグラフィック枠です
前回はレイトレーシングの歴史についてみていきました。
レイトレーシング自体は1986年のレイキャスティングのアイデアをベースとして1979年に初めての論文が登場しました。
レイトレーシング自体は計算量が多い処理であり、従来はプリレンダリングのみに用いられリアルタイムレンダリングに用いられることはありませんでしたが、近年のハードウェアの高性能化に加えアルゴリズムの改良などにより、リアルタイムレイトレーシングのゲームが登場してきています。
リアルタイムレイトレーシングが採用された初のゲームの事例は2018年の「BATTLEFIELD V」が初めてといわれています。
これにはMicrosoftの提供するグラフィックスAPIであるDirectX Raytracing(DXR)が大きく使用されており、ソフトウェアだけでなくハード側と連携してグラフィックスの向上が進んでいます。
今回は前回発見できた論文を斜め読みしながらレイトレーシングのアルゴリズムを見ていきます。
https://inst.eecs.berkeley.edu/~cs294-13/fa09/lectures/scribe-lecture1.pdf
基本的な内容は上記のとおりですが、筆者にとっての不明点や疑問点などを交えて膨らませています。
〇レイトレーシングのアルゴリズム
・レイの生成
・オブジェクトとの交差判定
・ピクセル色計算
・反射および屈折レイの追跡
・結果の合成
今回は最初のアルゴリズムレイの生成
を見ていきます。
〇アルゴリズム:レイの生成
レイトレーシングはレイキャスティングのアイデアを発展させて作り上げられています。
レイトレーシングのレイの生成過程はレイキャスティングの過程に非常に似ています。
次のような過程があります。
1. カメラの座標フレームの設定
カメラの座標フレームとは3D空間におけるカメラのトランスフォームの定義に用いられる座標系を指します。
具体的にはカメラの位置(原点)、視線の方向、画像平面の向きを定義します。
座標フレームは3D空間内の各点をカメラの視点からどのように見るかを定義します。この過程は遠視投影(遠近法を考慮した投影法)に関連しています。
次の式ではaはカメラの中心から視点へのベクトルを意味します。
aをその大きさで割り単位ベクトルを求めています。
単位ベクトルwはカメラの視線方向を指します。(前を向いている方向)
次にカメラに右向きのベクトルを求めます。
bは上向きベクトルを意味し、b×wは視線と上向き方向の外積であり、これの結果uが右向きを意味します。
レイトレーシングの場合3次元空間の定義に3つの直行ベクトルを求めますがこれによって視線のベクトル、カメラの上方ベクトル、カメラの右向きのベクトルの3つの直行ベクトルを求めることができました。
最後にカメラ座標系の上向きを求めます。
先ほど使用したbもおなじく上向きのベクトルではありますが、bはワールド座標系における上向きを意味します。
先ほど求めた視線の向きベクトルwと右向きのベクトルuの外積をとったvがカメラ座標系における上向きベクトルとなります。
a,bとは異なりw,uは単位ベクトルであるため外積の結果vはカメラ座標における上向きの単位ベクトルを意味します。
これによってカメラ座標系が決まります。(それぞれの単位ベクトル)
2. 標準視野幾何学
カメラの座標フレームの設定の次に、仮想スクリーン上のレイの方向を求めます。
仮想スクリーンとは3Dレンダリングのコンテキストに使用される概念であり、シーンが投影される2D平面を指します。最終成果物としては出力されるスクリーンと対応しますが出力以前に仮想的に用いられる概念を指します。
これを求めるためには次の計算式を用います。
ここでfovx、fovyはそれぞれ仮想スクリーンの水平方向、鉛直方向の大きさを意味します。
またi,jはそれぞれピクセルのサイズを意味します。
ここで定義されるα、βはそれぞれ仮想スクリーン上のピクセルに向かうレイの水平、鉛直方向の角度となります。
つまりαu,βvは、それぞれ単位ベクトルと角度の掛け算によりカメラ座標系における横方向、上方向への移動を意味します。
この手順によってレイの方向が定まりました。
〇レイとオブジェクトの交差
レイとオブジェクトの交差とは視点から発射されたレイが3D空間内のどの物体と交差するかを判定するプロセスです。
レイが物体の表面に当たるかどうか?またどの位置に当たるかを計算、交差点での色、明るさを求めるためのベースとします。
これはプリミティブの形状によって種類が異なりますが、一般的なアルゴリズムとしては似ています。
具体的には次に表すレイのパラメトリック方程式をそれぞれのプリミティブのパラメトリック方程式に代入します。
前回はレイトレーシングの歴史についてみていきました。
レイトレーシング自体は1986年のレイキャスティングのアイデアをベースとして1979年に初めての論文が登場しました。
レイトレーシング自体は計算量が多い処理であり、従来はプリレンダリングのみに用いられリアルタイムレンダリングに用いられることはありませんでしたが、近年のハードウェアの高性能化に加えアルゴリズムの改良などにより、リアルタイムレイトレーシングのゲームが登場してきています。
リアルタイムレイトレーシングが採用された初のゲームの事例は2018年の「BATTLEFIELD V」が初めてといわれています。
これにはMicrosoftの提供するグラフィックスAPIであるDirectX Raytracing(DXR)が大きく使用されており、ソフトウェアだけでなくハード側と連携してグラフィックスの向上が進んでいます。
今回は前回発見できた論文を斜め読みしながらレイトレーシングのアルゴリズムを見ていきます。
https://inst.eecs.berkeley.edu/~cs294-13/fa09/lectures/scribe-lecture1.pdf
基本的な内容は上記のとおりですが、筆者にとっての不明点や疑問点などを交えて膨らませています。
〇レイトレーシングのアルゴリズム
・レイの生成
・オブジェクトとの交差判定
・ピクセル色計算
・反射および屈折レイの追跡
・結果の合成
今回は冒頭部2つのアルゴリズムレイの生成
、オブジェクトとの交差判定
を見ていきます。
〇アルゴリズム:レイの生成
レイトレーシングはレイキャスティングのアイデアを発展させて作り上げられています。
レイトレーシングのレイの生成過程はレイキャスティングの過程に非常に似ています。
次のような過程があります。
1. カメラの座標フレームの設定
カメラの座標フレームとは3D空間におけるカメラのトランスフォームの定義に用いられる座標系を指します。
具体的にはカメラの位置(原点)、視線の方向、画像平面の向きを定義します。
座標フレームは3D空間内の各点をカメラの視点からどのように見るかを定義します。この過程は遠視投影(遠近法を考慮した投影法)に関連しています。
次の式ではaはカメラの中心から視点へのベクトルを意味します。
aをその大きさで割り単位ベクトルを求めています。
単位ベクトルwはカメラの視線方向を指します。(前を向いている方向)
次にカメラに右向きのベクトルを求めます。
bは上向きベクトルを意味し、b×wは視線と上向き方向の外積であり、これの結果uが右向きを意味します。
レイトレーシングの場合3次元空間の定義に3つの直行ベクトルを求めますがこれによって視線のベクトル、カメラの上方ベクトル、カメラの右向きのベクトルの3つの直行ベクトルを求めることができました。
最後にカメラ座標系の上向きを求めます。
先ほど使用したbもおなじく上向きのベクトルではありますが、bはワールド座標系における上向きを意味します。
先ほど求めた視線の向きベクトルwと右向きのベクトルuの外積をとったvがカメラ座標系における上向きベクトルとなります。
a,bとは異なりw,uは単位ベクトルであるため外積の結果vはカメラ座標における上向きの単位ベクトルを意味します。
これによってカメラ座標系が決まります。(それぞれの単位ベクトル)
2. 標準視野幾何学
カメラの座標フレームの設定の次に、仮想スクリーン上のレイの方向を求めます。
仮想スクリーンとは3Dレンダリングのコンテキストに使用される概念であり、シーンが投影される2D平面を指します。最終成果物としては出力されるスクリーンと対応しますが出力以前に仮想的に用いられる概念を指します。
これを求めるためには次の計算式を用います。
ここでfovx、fovyはそれぞれ仮想スクリーンの水平方向、鉛直方向の大きさを意味します。
またi,jはそれぞれピクセルのサイズを意味します。
ここで定義されるα、βはそれぞれ仮想スクリーン上のピクセルに向かうレイの水平、鉛直方向の角度となります。
つまりαu,βvは、それぞれ単位ベクトルと角度の掛け算によりカメラ座標系における横方向、上方向への移動を意味します。
この手順によってレイの方向が定まりました。
本日は以上です。
次回はレイの交差まで見ていきます。