私は個人的な学習プロジェクト ( Enlight ) として 3D レイトレーサーを書いていますが、レイとオブジェクトのシーンの間の交差テストの実行に関連する興味深い問題に遭遇しました。
状況は次のとおりです。
- 光線が交差できる多数のプリミティブ (球、ボックス、平面など) とそのグループがあります。これらをまとめてシーン オブジェクトと呼んでいます。
- オブジェクトにラップすることで、任意のアフィン変換でオブジェクト プリミティブをシーン化できるようにしたい
Transform
(重要なことに、プリミティブは不変であるため、同じプリミティブの複数のインスタンスをシーン内の異なる位置で使用できるようになります)。 - シーン オブジェクトはバウンディング ボリューム階層に格納される場合があります (つまり、空間分割を行っています)。
- 私の交差テスト
Ray
は、部分光線セグメント (開始ベクトル、正規化された方向ベクトル、開始距離、終了距離) を表すオブジェクトで機能します。
問題は、光線が Transform オブジェクトのバウンディング ボックスに当たったときに、含まれている変換Ray
されたプリミティブとの交差テストを行う唯一の方法は、変換された座標空間に変換することです。これは簡単ですが、レイが変換されたオブジェクトに当たらない場合は、元のオブジェクトにフォールバックしてRay
トレースを続行する必要があります。Ray
Transform はネストされる可能性があるため、これは、実行される交差トレースごとに のスタック全体を維持する必要があることを意味します。
もちろん、これはアプリケーション全体の内部ループ内にあり、主要なパフォーマンスのボトルネックです。1秒間に何百万回も呼び出されるため、複雑さを最小限に抑え、不要なメモリ割り当てを回避したいと考えています。
Ray
新しいs を割り当てる/Ray
スタックを保持する必要を回避する賢い方法はありますか?
または、これを完全に行うより賢い方法はありますか?