バウンディング区間階層(BIH)は、バウンディングボリューム階層やkdツリーと同様のパーティショニングデータ構造です。バウンディング区間階層は、高性能(またはリアルタイム)レイトレーシングに使用でき、特に動的なシーンで役立ちます。
BIHは、OoiらによってSKD-Trees [ 1 ]という名称で最初に発表され、 Zachmannによって独自にBoxTrees [ 2 ]という名称で発表されました。
バウンディング区間階層 (BIH) は、バウンディングボリューム階層(BVH) とkd ツリーの両方の特性を多く備えています。BIH の構築と格納は BVH と似ていますが、BIH の走査はkd ツリーの走査に似ています。さらに、BIH はkd ツリー (およびその上位集合であるBSP ツリー) と同様に二分木でもあります。最後に、BIH は、その祖先と同様に軸に平行です。軸に平行でない BIH のより一般的な実装 (非平行平面を使用する BSP ツリーと同様) も可能ですが、数値安定性の低下とレイ走査の複雑さの増加のため、ほぼ確実に望ましくありません。
BIHの重要な特徴は、ノードごとに2つの平面を格納することです(kdツリーでは1つ、軸に沿ったバウンディングボックス階層では6つ)。これにより、子ノードの重なりが可能になり(BVHと同様)、同時に、子ノードが1つの次元/軸に沿って順序付けられます(kdツリーの場合と同様)。
構築フェーズでは BIH データ構造のみを使用し、従来の軸平行境界ボックス階層と同様の方法でツリーを走査することも可能です。これにより、メモリ/キャッシュの使用量を低く抑えながら、大規模なレイバンドル[ 3 ]に対していくつかの簡単な高速化最適化が可能になります。
[ 4 ]で説明されている境界区間階層(およびBIHに関連する手法)の一般的な属性には、次のようなものがあります。
空間分割構造を構築するには、何らかのヒューリスティックが一般的に使用されます。このために、多くの分割スキームで一般的に使用されている表面積ヒューリスティックが候補となります。もう1つのより単純なヒューリスティックは、「グローバル」ヒューリスティック[ 4 ]で、プリミティブの完全なセットではなく、軸に沿った境界ボックスのみを必要とするため、高速な構築に非常に適しています。
BIHの一般的な構造設計図:
分割平面候補探索のための潜在的なヒューリスティック:
走査フェーズはkd木走査によく似ている。4つの単純なケースを区別する必要がある。
3番目のケースでは、コンポーネント(x、y、z)のレイの方向(負または正)が現在のノードの分割軸と等しいかどうかに応じて、トラバーサルはまず左(正の方向)または右(負の方向)の子で続行され、もう一方の子は遅延トラバーサルのためにスタックにプッシュされます。
葉ノードが見つかるまで走査が続きます。葉ノード内のオブジェクトとの交差が終わると、次の走査要素がスタックからポップされます。スタックが空の場合は、貫通したすべての葉ノードの最も近い交差が返されます。ポップされた要素が現在の最も近い交差を完全に超えている場合は、その走査はスキップされます。
5番目の走査ケースを追加することも可能ですが、それにはやや複雑な構築フェーズが必要です。ノードの左右の平面の意味を入れ替えることで、ノードの両側の空きスペースを切り取ることができます。これには、走査中にこの特殊なケースを検出するためにノードに格納する必要のある追加のビットが必要です。走査フェーズでのこのケースの処理は、レイが
三角形の階層構造の構築/ソート中のすべての操作は、最小値/最大値演算と比較です。そのため、kdツリーの場合のように三角形のクリッピングを行う必要はありません。kdツリーでは、ノードとわずかに交差する三角形の場合、クリッピングが問題となることがあります。kdツリーの実装が注意深く記述されていても、数値エラーによって交差が検出されず、レイとオブジェクトの交差が見逃されることでレンダリングエラー(ジオメトリに穴が開く)が発生する可能性があります。
ジオメトリを分離するためにノードごとに 2 つの平面を使用する代わりに、任意の数の平面を使用して n 進 BIH を作成したり、標準バイナリ BIH で複数の平面を使用したり (ノードごとに 1 つおよび 4 つの平面は[ 4 ]ですでに提案され、 [ 5 ]で適切に評価されました)、より優れたオブジェクト分離を実現することもできます。