3

iOS 用の MetalFramework を使用してリアルタイム レイ トレーサーを実装しました。これは、12 面体、20 面体、8 面体、立方体などの光学プリズムを追跡するために実装されています。光線をたどって図形との交点を探し、次に光線がプリズム内でどのように動くかを調べます。レイは人影を離れ、スカイボックスとの交点を探す。問題は複雑な図です。立方体の fps をテストすると 60 ですが、12 面体の fps をテストすると 6 です。私のアルゴリズムでは、図との交点は三角形との交点と同じです。これは、光線と図形との交差をチェックするときに、すべての三角形との交差をチェックする必要があることを意味します。すべての三角形の交点をチェックしないようにする方法が必要です。ありがとう。

4

2 に答える 2

3

あなたがいくつかのバウンディングボックスで囲まれた世界を持っているとしましょう

  1. グリッドを作成します(このボックスを立方体などに分割します)

    ボクセルのようなマップの例

  2. 各ボクセル/セル

    交差するか、その中にある三角形のリストであるため、各セルをレンダリングする前に、すべての三角形を処理し、内部または交差するすべての三角形のインデックスを保存します

  3. このボクセルマップをトレースするようにレイトレーサーを書き直します

    したがって、隣接するボクセルを介してレイをインクリメントするだけで、ピクセルのライン ラスタライズと同じになります。このようにして、部分的に Z ソートが完了しました。したがって、光線が最初にヒットしたボクセルを取得し、それに含まれる三角形のみをテストします。ボクセルにヒットが見つかった場合は停止します (他のボクセルは遠いため、テストする必要はありません)。

  4. さらなる最適化

    三角形がテストされている場合はフラグを追加できます。そうしないと、多くの三角形が複数回テストされるため、まだテストされていないもののみをテストします

[ノート]

軸ごとのボクセル数はパフォーマンスに大きく影響するため、最高のパフォーマンスを達成するには少し調整する必要があります。動的オブジェクトがある場合、ボクセル マップ リストの計算は、時々、または各フレームごとに行う必要があります。静的シーンの場合、これを 1 回実行するだけで十分です。

于 2015-03-04T13:16:12.120 に答える
1

効率的にトレースするには、KD ツリーやバウンディング ボリューム階層 (BVH) などのアクセラレーション構造を使用する必要があります。これは、二分探索木を使用して一致する要素を見つけることに似ています。

BVH を使用することをお勧めします。これは、KD ツリーよりも構築とトラバースが簡単だからです。また、均一なボクセル グリッド構造を使用しないことをお勧めします。ボクセル グリッドは、三角形がシーン全体に不均一に分布しているか、いくつかのボクセルに集中している場合、パフォーマンスが非常に低下する可能性があります。

BVH は、その中にプリミティブを包含する軸整列バウンディング ボックス (AABB) などのバウンディング ボリュームの単なるツリーです。このようにして、レイがバウンディング ボリュームを逃した場合、それに含まれるプリミティブにヒットしないことがわかります。

BVH を作成するには:

  1. すべての三角形を 1 つのバウンディング ボリュームに入れます。これがツリーのルートになります。

  2. 三角形を 2 つのセットに分割し、三角形の各セットのバウンディング ボリュームを最小化します。より適切には、両方の三角形のセットの (BVH の表面積)/(# 三角形) の合計を最小化する三角形のセットを作成する、表面積ヒューリスティック (SAH) に従うことをお勧めします。

  3. 残っている三角形の数があるしきい値に達するまで、ノードごとにステップ 2 を再帰的に繰り返します (4 が適切な数です)。

トラバースする

  1. レイがルート バウンディング ボックスに当たるかどうかを確認します。当たっている場合はステップ 2 に進みます。そうでない場合はヒットしません。

  2. 子バウンディング ボックスにヒットするかどうかを確認します。存在する場合は、その子バウンディング ボックスに対してこの手順を繰り返します。そうでなければノーヒット。

  3. 三角形のみを含む境界ボックスを取得したら、各三角形をテストして、通常どおりにヒットするかどうかを確認する必要があります。

これがBVHの基本的な考え方です。詳細には非常に多くのバリエーションがあるため、検索する必要がある BVH については詳しく説明していません。

要するに、トレースするバウンディング ボリューム階層を実装します。

于 2015-03-21T08:54:56.543 に答える