7

私は個人的な学習プロジェクト ( Enlight ) として 3D レイトレーサーを書いていますが、レイとオブジェクトのシーンの間の交差テストの実行に関連する興味深い問題に遭遇しました。

状況は次のとおりです。

  • 光線が交差できる多数のプリミティブ (球、ボックス、平面など) とそのグループがあります。これらをまとめてシーン オブジェクトと呼んでいます。
  • オブジェクトにラップすることで、任意のアフィン変換でオブジェクト プリミティブをシーン化できるようにしたいTransform(重要なことに、プリミティブは不変であるため、同じプリミティブの複数のインスタンスをシーン内の異なる位置で使用できるようになります)。
  • シーン オブジェクトはバウンディング ボリューム階層に格納される場合があります (つまり、空間分割を行っています)。
  • 私の交差テストRayは、部分光線セグメント (開始ベクトル、正規化された方向ベクトル、開始距離、終了距離) を表すオブジェクトで機能します。

問題は、光線が Transform オブジェクトのバウンディング ボックスに当たったときに、含まれている変換Rayされたプリミティブとの交差テストを行う唯一の方法は、変換された座標空間に変換することです。これは簡単ですが、レイが変換されたオブジェクトに当たらない場合は、元のオブジェクトにフォールバックしてRayトレースを続行する必要があります。RayTransform はネストされる可能性があるため、これは、実行される交差トレースごとに のスタック全体を維持する必要があることを意味します。

もちろん、これはアプリケーション全体の内部ループ内にあり、主要なパフォーマンスのボトルネックです。1秒間に何百万回も呼び出されるため、複雑さを最小限に抑え、不要なメモリ割り当てを回避したいと考えています。

Ray新しいs を割り当てる/Rayスタックを保持する必要を回避する賢い方法はありますか?

または、これを完全に行うより賢い方法はありますか?

4

2 に答える 2

2

ほとんどの場合、レイ トレーシングでは数個 (数百、数千) のオブジェクトと、かなり多くのレイがあります。おそらく数百万の光線。その場合、光線がオブジェクトと相互作用するのをより速く/より簡単にするために、オブジェクトにどのような種類の計算を費やすことができるかを確認することは理にかなっています。

boyfarrell が提案したように、キャッシュは非常に役立ちます。オブジェクトをグローバル フレームとの間で移動させる順変換と逆変換を作成するだけでなく、オブジェクトのコピーをグローバル フレームに保持することも理にかなっている場合があります。オブジェクトの作成や移動のコストが高くなります (トランスフォームが変更され、キャッシュされたグローバル フレーム コピーも変更されるため) が、おそらく問題ありません。

N 個のレイをキャストし、M 個のオブジェクトがあり、N >> M の場合、すべてのオブジェクトに複数のレイが当たるのは理にかなっています。すべての光線がオブジェクトに当たると仮定すると、すべてのオブジェクトに当たる N/M の光線があります。これは、N/M 光線を各オブジェクトに変換し、ヒット テストを行い、場合によっては元に戻すことを意味します。または、最低でもオブジェクトごとに N/M 変換。しかし、変換されたオブジェクトをキャッシュすると、オブジェクトごとに 1 回の変換を実行してグローバル フレームを取得でき、それ以上の変換は必要ありません。少なくともヒットテストのために。

于 2012-12-29T23:04:49.520 に答える
1

プリミティブをベース フォーム (ユニティ スケール、0,0,0 を中心とし、回転させない) で定義し、変換のみを使用してシーン内で移動します。各オブジェクトの完全な順変換と逆変換の結果をキャッシュします。(法線ベクトルを忘れないでください。反射に必要になります)

これにより、単純化された数学を使用してヒットをテストし (光線をオブジェクト空間に逆変換し、ベース フォーム オブジェクトでヒットを計算します)、ヒット ポイントと可能な反射ベクトルを、もう一方の関数を使用して現実世界の空間に戻すことができます。変身。

シーン内のすべてのオブジェクトとの交差を計算し、レイ原点に最も近いヒットを選択する必要があります (ただし、負の距離ではありません)。これをさらに高速化するには、ヒットの計算が非常に簡単な「バウンディング ボックス」に複数のオブジェクトを囲み、ヒットした場合に囲まれたオブジェクトに現実世界の光線を渡します (ただし、すべてのオブジェクトは事前に計算された行列を使用します)。

于 2013-01-21T09:53:07.533 に答える