(57)【要約】      （修正有）【課題】シーンの三角形および境界ボリューム階層（ＢＶＨ）をコンパクトな１つのデータ構造としてエンコードする方法およびシステム。【解決手段】インタラクティブなレイトレーシングにおいて、高効率かつ容易な復元が実行され利用されてよい。量子化された頂点および三角形のストリップは、ＢＶＨリーフノードに格納されてよい。ローカル頂点位置および頂点インデックスは、ビット列にエンコーディングされた少数のビットを用いてよい。トラバースの際には、最適なアルゴリズムでデコーディングし、オーバーヘッドが最小限であるランダムアクセスを実現してよい。【選択図】図１
2011081788.tif 000002
【特許請求の範囲】
【請求項１】
隣接する三角形が共にスナップされるように、シーンの三角形をグローバルグリッド上で量子化する段階と、
可変長のビット列として前記三角形の頂点位置をエンコードする段階と、
前記三角形の接続性をモデリングする段階と、
前記シーンの少なくとも一部を表すコンパクトな境界ボリューム階層（ＢＶＨ）を構築する段階と
を備え、
グラフィックス処理を実行するプロセッサによって実行される方法。
【請求項２】
前記頂点位置をエンコードする段階は、
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離を記述するデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算する段階と、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定する段階と、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするのに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定する段階と、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードする段階と
を有し、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１に記載の方法。
【請求項３】
前記頂点位置をエンコードする段階は、
各頂点について、デルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算する段階と、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定する段階と、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定する段階と、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードする段階と、
ｘｉ、ｙｉおよびｚｉのそれぞれに前記境界ボックスの最近傍の平面を識別する追加の１ビットを加える段階と
を有し、
前記Ｄｉの各コンポーネントは、前記頂点を含む前記最近傍の平面から前記頂点までの距離を前記コンポーネントの次元と共に示し、前記最近傍の平面は、前記次元に垂直であり、原点を含む平面または前記原点を含む前記平面に対向する平面のいずれかであり、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１に記載の方法。
【請求項４】
前記接続性をモデリングする段階は、前記三角形それぞれの各頂点を識別する段階を有し、前記三角形の１つの頂点が複数の三角形の頂点である場合は、前記頂点は前記複数の三角形のそれぞれについて個別に識別される請求項１に記載の方法。
【請求項５】
前記接続性をモデリングする段階は、
各頂点を１回識別する段階と、
インデックスをそれぞれ頂点に関連付ける段階と、
前記三角形の３つの頂点のそれぞれに関連付けられた３つのインデックスをリストすることで前記三角形をそれぞれに識別する段階と
を有する請求項１に記載の方法。
【請求項６】
前記接続性をモデリングする段階は、
前記ＢＶＨ内のリーフ毎の三角形の最大数を指定する段階と、
ルックアップテーブル（ＬＵＴ）を構築する段階と、
前記ＬＵＴの各エントリについて、前記三角形の数および前記三角形それぞれの第１の頂点のオフセットを格納する段階と、
前記三角形それぞれの方向を格納する段階と
を有し、前記ＬＵＴの各エントリはストリップ群に関連付けられ、前記ストリップのそれぞれは、１個以上の隣接する三角形のシーケンスを含み、１個の三角形は前記ＬＵＴに１回のみ現れる請求項１に記載の方法。
【請求項７】
前記コンパクトなＢＶＨを構築する段階は、
各子ノードについて、関連付けられた親ノードの境界ボリュームを基準にして指定された境界ボリュームを定義する段階と、
複数の子ノードをブロックにグループ化する段階と、
前記ブロックのそれぞれについて、前記ブロック内の各子ノードのインデックスを定義する段階と、
リーフを含むブロックそれぞれについて、前記ブロックに関連付けられたリーフデータを前記ブロックの後にリストする段階と、
下部ノードを圧縮形式で格納し、上部ノードの少なくとも一部を非圧縮形式で格納する段階と
を有する請求項１に記載の方法。
【請求項８】
前記ブロック内の子ノードは、フォワーディングノードが前記子ノードの従属サブツリーを指すように前記フォワーディングノードにマッピングされ、前記サブツリーは、異なるブロックに存在する請求項７に記載の方法。
【請求項９】
プロセッサと、
前記プロセッサと通信するメモリとを備えるシステムであって、
前記メモリは複数の処理命令を格納し、前記複数の処理命令は前記プロセッサに、
隣接する三角形が共にスナップされるようにシーンの複数の三角形をグローバルグリッド上で量子化させ、
前記三角形の頂点位置を可変長のビット列としてエンコードさせ、
前記三角形の接続性をモデリングさせ、
前記シーンの少なくとも一部を表すコンパクトな境界ボリューム階層（ＢＶＨ）を構築させるための処理命令である
システム。
【請求項１０】
前記プロセッサに頂点位置をエンコードするように指示する前記命令は、前記プロセッサに
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離であるデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させ、
前記境界ボックスの全ての頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させ、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定させ、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードさせるための命令を有し、
前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項９に記載のシステム。
【請求項１１】
前記プロセッサに頂点位置をエンコードするように指示する前記命令は、前記プロセッサに
各頂点について、デルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させ、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させ、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定させ、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードさせ、
ｘｉ、ｙｉおよびｚｉに最近傍の平面を識別する追加の１ビットを加えさせるための命令を有し、
前記Ｄｉの各コンポーネントは、前記頂点を含む前記境界ボックスの前記最近傍の平面から前記頂点までの距離を前記コンポーネントの次元と共に示し、前記最近傍の平面は、前記次元に垂直であり、原点を含む平面または前記原点を含む前記平面に対向する平面のいずれかであり、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項９に記載のシステム。
【請求項１２】
前記プロセッサに接続性をモデリングするように指示する前記命令は、前記プロセッサに
前記三角形それぞれの各頂点を識別させるための命令を有し、前記三角形の１つの頂点が複数の三角形の頂点である場合は、前記頂点は前記複数の三角形のそれぞれについて個別に識別される請求項９に記載のシステム。
【請求項１３】
前記プロセッサに接続性をモデリングするように指示する前記命令は、前記プロセッサに
各頂点を１回識別させ、
インデックスをそれぞれ頂点に関連付けさせ、
前記三角形の３つの頂点のそれぞれに関連付けられた３つのインデックスをリストすることで前記三角形をそれぞれに識別させるための命令を有する請求項９に記載のシステム。
【請求項１４】
前記プロセッサに接続性をモデリングするように指示する前記命令は、前記プロセッサに、
前記ＢＶＨ内のリーフ毎の三角形の最大数を指定させ、
ルックアップテーブル（ＬＵＴ）を構築させ、
各エントリについて、前記三角形の数および前記三角形それぞれの第１の頂点のオフセットを格納させ、
前記三角形それぞれの方向を格納させるための命令を有し、
前記ＬＵＴの各エントリはストリップ群に関連付けられ、前記ストリップのそれぞれは、１個以上の隣接する三角形のシーケンスを含み、１個の三角形は前記ＬＵＴに１回のみ現れる請求項９に記載のシステム。
【請求項１５】
前記プロセッサに前記コンパクトなＢＶＨを構築するように指示する前記命令は、前記プロセッサに
各子ノードについて、関連付けられた親ノードの境界ボリュームを基準にして指定された境界ボリュームを定義させ、
複数の子ノードをブロックにグループ化させ、
前記ブロックのそれぞれについて、前記ブロック内の各子ノードのインデックスを定義させ、
リーフを含むブロックそれぞれについて、前記ブロックに関連付けられたリーフデータを前記ブロックの後にリストさせ、
下部ノードを圧縮形式で格納し、上部ノードの少なくとも一部を非圧縮形式で格納させるための命令を有する請求項９に記載のシステム。
【請求項１６】
前記ブロック内の子ノードは、フォワーディングノードが前記子ノードの従属サブツリーを指すように前記フォワーディングノードにマッピングされ、前記サブツリーは、異なるブロックに存在する請求項１５に記載のシステム。
【請求項１７】
コンピュータプログラムロジックを格納したコンピュータ可読媒体を備えるコンピュータプログラム製品であって、
前記コンピュータプログラムロジックは、
プロセッサに、グローバルグリッド上でシーンの複数の三角形を隣接する複数の三角形が一緒にスナップされるように量子化させるロジックと、
前記プロセッサに、前記複数の三角形の頂点位置を可変長のビット列としてエンコードさせるロジックと、
前記プロセッサに、前記複数の三角形の接続性をモデル化させるロジックと、
前記プロセッサに、前記シーンの少なくとも一部を表すコンパクトな境界ボリューム階層（ＢＶＨ）を構築させるロジックと
を有するコンピュータプログラム製品。
【請求項１８】
前記頂点位置を前記プロセッサにエンコードさせる前記ロジックは、
前記プロセッサに、各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離を記述するデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させるロジックと、
前記プロセッサに、前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させるロジックと、
前記プロセッサに、前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を前記プロセッサに決定させるロジックと、
前記プロセッサに、前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードさせるロジックと
を有し、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１７に記載のコンピュータプログラム製品。
【請求項１９】
前記頂点位置を前記プロセッサにエンコードさせる前記ロジックは、
前記プロセッサに、各頂点について、デルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させるロジックと、
前記プロセッサに、前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させるロジックと、
前記プロセッサに、前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定させるロジックと、
前記プロセッサに、前記（ｎｘ，ｎｙ，ｎｚ）をエンコードさせるロジックと、
前記プロセッサに、ｘｉ、ｙｉおよびｚｉに最近傍の平面を識別する追加の１ビットを加えさせるロジックと
を有し、
前記Ｄｉの各コンポーネントは、前記頂点を含む前記境界ボックスの前記最近傍の平面から前記頂点までの距離を前記コンポーネントの次元と共に示し、前記最近傍の平面は、前記次元に垂直であり、前記原点を含む平面または前記原点を含む前記平面に対向する平面のいずれかであり、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１７に記載のコンピュータプログラム製品。
【請求項２０】
前記プロセッサに、前記接続性をモデリングさせる前記ロジックは、前記プロセッサに前記三角形それぞれの各頂点を識別させるロジックを有し、前記三角形の１つの頂点が複数の三角形の頂点である場合は、前記頂点は前記複数の三角形のそれぞれについて個別に識別される請求項１７に記載のコンピュータプログラム製品。
【請求項２１】
前記プロセッサに、前記接続性をモデリングさせる前記ロジックは、
前記プロセッサに、各頂点を１回識別させるロジックと、
前記プロセッサに、インデックスをそれぞれ頂点に関連付けさせるロジックと、
前記プロセッサに、前記三角形の３つの頂点のそれぞれに関連付けられた３つのインデックスをリストすることで前記三角形をそれぞれに識別させるロジックと
を有する請求項１７に記載のコンピュータプログラム製品。
【請求項２２】
前記プロセッサに、前記接続性をモデリングさせるロジックは、
前記プロセッサに、前記ＢＶＨ内のリーフ毎の三角形の最大数を指定させるロジックと、
前記プロセッサに、ルックアップテーブル（ＬＵＴ）を構築させるロジックと、
前記プロセッサに、各エントリについて、前記三角形の数および前記三角形それぞれの第１の頂点のオフセットを格納させるロジックと、
前記プロセッサに、前記三角形それぞれの方向を格納させるロジックと
を有し、前記ＬＵＴの各エントリはストリップ群に関連付けられ、前記ストリップのそれぞれは、１個以上の隣接する三角形のシーケンスを含み、１個の三角形は前記ＬＵＴに１回のみ現れる請求項１７に記載のコンピュータプログラム製品。
【請求項２３】
前記プロセッサに、前記コンパクトなＢＶＨを構築させる前記ロジックは、
前記プロセッサに、各子ノードについて、関連付けられた親ノードの境界ボリュームを基準にして指定された境界ボリュームを定義させるロジックと、
前記プロセッサに、複数の子ノードをブロックにグループ化させるロジックと、
前記プロセッサに、前記ブロックのそれぞれについて、前記ブロック内の各子ノードのインデックスを定義させるロジックと、
前記プロセッサに、リーフを含むブロックそれぞれについて、前記ブロックに関連付けられたリーフデータを前記ブロックの後にリストさせるロジックと、
前記プロセッサに、下部ノードを圧縮形式で格納し、上部ノードの少なくとも一部を非圧縮形式で格納させるロジックと
を有する請求項１７に記載のコンピュータプログラム製品。
【請求項２４】
前記ブロック内の子ノードは、フォワーディングノードが前記子ノードの従属サブツリーを指すように前記フォワーディングノードにマッピングされ、前記サブツリーは、異なるブロックに存在する請求項２３に記載のコンピュータプログラム製品。
【発明の詳細な説明】
【背景技術】
【０００１】
レイトレーシングは、オフラインのレンダリングおよびインタラクティブなアプリケーションの両方においてますます重要になってきている。レイトレーシングは、その柔軟性と写実的な画質から、大域照明などの課題を解決するに適したアルゴリズムである。近年、リアルタイムのレンダリングにおけるレイトレーシングの適合性が実証されてきた。今日のレイトレーサの性能は、多様な状況のラスタライゼーションを有することで優れており、よりロバスト性に優れた使い勝手がよいものになり得る。従来のラスタライゼーションに基づいたレンダリングパイプラインの利点は、今後登場する完全にプログラム可能なグラフィックスアーキテクチャによって縮小する可能性がある。
【０００２】
しかしながら、レイトレーシングにおける課題の１つに、デバイスメモリにシーン全体を収容可能な場合にのみ最適な性能が発揮され得る点がある。多くの場合、インタラクティブなレイトレーシングの実装は高フレームレートを生じることから、大容量のメモリを利用する。これは、高速ではあるが限られたメモリを有するグラフィックスボードの場合と同じく、実際のアプリケーションでは問題となる。
【０００３】
データ圧縮が高速レイトレーシングにおいて積極的に用いられない理由は、多くの圧縮アルゴリズムの性能の影響とランダムアクセスのサポート欠如とにある。レンダリングの前にデータ群全体を順次復元することが選択肢にない場合がある。最近開発されたアルゴリズムは、その方向性は正しいものの、達成可能な圧縮率が中程度に過ぎないか、またはキャッシュを用いたデータ構造のブロック毎の復元を必要とするかのいずれかである。メモリに限りのある極めて大きなモデルのリアルタイムレイトレーシングにおいては、これらの制限のいずれもが問題となる。
【図面の簡単な説明】
【０００４】
【図１】本発明のある実施形態に係る、以下に説明するプロセス全体を示すフローチャート図である。
【図２】本発明のある実施形態に係る、グローバルグリッドにおける三角形の配置を示す。
【図３】本発明のある実施形態に係る、頂点位置のビット列へのエンコーディングを示すフローチャート図である。
【図４】本発明のある実施形態に係る、最近傍の境界平面が追加のビットで示され得る、頂点のエンコーディングを示す。
【図５】本発明のある実施形態に係る、三角形の接続性のモデリングにおけるルックアップテーブルの利用を示すフローチャート図である。
【図６】本発明のある実施形態に係る、頂点のデコーディングにおける不整列なロードの利用を示す。
【図７】本発明のある実施形態に係る、コンパクトな境界ボリューム階層の構築を示すフローチャート図である。
【図８】本発明のある実施形態に係る、子ノードがブロックにグループ化され得る境界ボリューム階層のレイアウトを示す。
【図９】本発明のある実施形態に係る、以下に説明するプロセスのソフトウェアまたはファームウェアの実装を示す。
【発明を実施するための形態】
【０００５】
類似の符号が同一または機能的に類似な要素を示す図面を参照して、望ましい実施形態について説明する。また図面では、各符号の最上位桁はその符号が最初に現れる図面の番号を示す。具体的な構成および配置について説明するが、これが説明を目的としているに過ぎないことが理解されるべきである。当業者であれば、説明の趣旨および範囲から逸脱することなく他の構成および配置を利用可能であることを認識するであろう。ここに説明する以外の様々なシステムおよびアプリケーションに応用可能であることは、当業者にとって明らかである。
【０００６】
以下に説明する方法およびシステムは、三角形メッシュおよびその境界ボリューム階層（ＢＶＨ）をコンパクトな階層データ構造として格納することができる。ＢＶＨは加速構造、および三角形メッシュの階層圧縮表現として利用できる。これは、ＢＶＨが三角メッシュの近似を表現可能であることを活用している。メッシュの頂点は、少数のビットで量子化された値としてＢＶＨのリーフ内部に格納され得る。
【０００７】
しかしながら、リーフノード内の頂点位置を量子化する際に、異なるリーフに存在する隣接する三角形間に間隙が生じ得る。これは、２つのリーフノード内の量子化位置が整列していない場合があることに起因する。ある実施形態では、グリッド上で全てのリーフノードを整列可能なグローバル量子化グリッドにより、この問題を解決できる。三角形の頂点は同一グリッドにスナップされてよく、それらの位置は、それぞれが対応する境界ボックスの原点に対する整数オフセットとして格納可能である。一般的に、１つのリーフノード内の整数位置の範囲は小さく、圧縮が容易である。
【０００８】
整数値は、例えばハフマン符号化または算術符号化等の積極的な圧縮アルゴリズムでエンコードされ得る。ある実施形態では、データがビット列で格納されてよい。適切なアンパック（ｕｎｐａｃｋ）関数を利用して、これらのデータを低コストでデコードしてよい。
【０００９】
頂点位置に加えて、頂点の接続性も圧縮可能である。三角形は、ストリップまたはインデックス化されたストリップのいずれか小さい方として、ＢＶＨノード内にローカルに格納されてよい。量子化された位置と同じく、頂点インデックスの範囲は小さく、圧縮可能である。
【００１０】
また境界ボリューム階層そのものもコンパクトな形式で格納可能である。ＢＶＨノードは量子化できる。さらに、ノードはクラスタで格納可能である。このように、子ポインタは、少数のビットだけを必要とするクラスタ内のローカルオフセットを表現できる。ＢＶＨノードのサイズは、全体として例えば３２バイトから４バイトへと縮小できる。一般的にＢＶＨ構築アルゴリズムについての制限はないことから、従来のビルダを利用可能である。
【００１１】
図１に、ある実施形態に係るプロセスの全体を示す。ステップ１１０では、モデルの三角形がグローバルグリッドで量子化およびスナップされる。これは、三角形がそれぞれのローカルグリッドで量子化された場合に発生してしまう間隙を除去するべく行なわれてよい。ステップ１２０では、三角形の頂点位置がビット列としてエンコードされる。これは、頂点を表すために必要なビットの数が最小限となるように行なわれてよい。ステップ１３０では、三角形の接続性がモデル化される。ある実施形態では、これが以下に詳述するように三角形をストリップとして捉えることで行なわれてよい。ステップ１４０では、モデルの一部または全てがＢＶＨで表されてよい。ある実施形態では、以下の詳述するようにＢＶＨがコンパクトに構築されてよい。プロセスはステップ１５０で終了してよい。
【００１２】
＜グローバルグリッドでの量子化＞
図２に、ある実施形態に係るグローバルグリッドにおける三角形の配置を示す。境界ボリューム階層に照らし、形を三角形の群としてモデリングする際に、個々の多角形をローカルで量子化されたグリッドに配置すると、形状に割れ目または間隙が現れる場合がある。これは、同一のグローバルグリッドに全ての三角形の頂点およびリーフ境界ボックスをスナップすることで防ぐことが可能である。左端の図２１０は、頂点が量子化される前、かつグリッドに配置される前の隣接する三角形群を示す。中央の図２２０は、各々のローカルグリッドで量子化および配置された複数の三角形を示す。複数の三角形をマージすると、結合するべき三角形の間に間隙が生じる場合がある。これらの例えば間隙２２５のような間隙は、ローカル量子化によるアーティファクトであり得る。ある実施形態では、間隙を除去するべく三角形をスナップ可能な、グローバルグリッドを利用できる。これを右端の図２３０に示す。ここでは、間隙２２５が除去されてよい。ＢＶＨにおいては、グローバルにスナップされた境界ボックスは、頂点の復元によって速やかにスナップされ得ることから、これらを格納する必要がないことは留意に値する。
【００１３】
＜頂点位置のエンコーディング＞
さらにメモリを節約するべく、三角形の頂点がビット列を用いて指定されてよい。ある実施形態では、境界ボックスの原点Ｏを基準として頂点位置がエンコードされてよい。したがって、エンコードする頂点群（Ａｉ）について、まずＯからＡｉのそれぞれの頂点へのデルタベクトル（Ｄｉ＝｛ｘｉ，ｙｉ，ｚｉ｝）が計算されてよい。その後、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）がそれぞれ計算されてよい。（ｎｘ，ｎｙ，ｎｚ）は、各頂点の各座標で最大限必要な合計ビット数ｎを示し、可変ビットエンコーディングスキームをもたらす。ある実施形態では、各頂点に必要なビット数（ｎｘ，ｎｙ，ｎｚ）はビット列としてエンコーディングされる。その後、頂点データは待機状態とされてよい。
【００１４】
図３に、ある実施形態に係る頂点のエンコーディングを示す。ステップ３１０では、各頂点についてデルタベクトル（Ｄｉ＝｛ｘｉ，ｙｉ，ｚｉ｝）が計算されてよい。このベクトルの各コンポーネントは、境界ボックスの原点から頂点までのその次元における距離を示す。ステップ３２０では、Ａｉの全ての頂点について、各次元の最大値が決定されてよい。これらの最大値をｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）として示す。ステップ３３０では、これらの最大値のそれぞれをエンコーディングするために必要なビット数が決定されてよい。これにより、これらの最大値を表す３つの値（ｎｘ，ｎｙ，ｎｚ）が生じる。ステップ３４０では、これらの値（ｎｘ，ｎｙ，ｎｚ）がビット列で表され、Ａｉの頂点データがこれらに続いてよい。プロセスはステップ３５０で終了してよい。
【００１５】
境界ボックス内の頂点データをエンコードする技術の１つに、原点からの整数デルタベクトルを計算する方法がある。しかしながら、リーフ境界ボックスは、頂点を包含する実際の境界ボックスである。頂点の一部が境界ボックスの１つの面の上または近傍に位置することから、原点からではなく最近傍の平面からのデルタ値を計算することにより、より少数のビットで表現可能な小さなデルタベクトルをもたらし得る場合がある。
【００１６】
したがって、ある実施形態では、デルタベクトルの各コンポーネントについて１ビットを追加してすることで、距離の計測が開始される最近傍の平面を識別してよい。これにより、頂点データの最終的なサイズ、つまりビット数を低減することができる。これは特に、大きな三角形を数多く有するモデルにおいて有効である。図４に示す二次元の例では、頂点Ｄを含む各頂点についてデルタベクトルが作成されてよい。ここではあらゆる頂点について、頂点から４０５で示された原点Ｏまでのｘ方向の距離を示すためにｘｍｉｎが用いられてよい。原点４０５からＤまでのｙ方向の距離を示すために可変のｙｍｉｎが用いられてよい。頂点Ｄにおいては、ｙ次元での最近傍の「平面」は上部境界４１０であり、ｘ次元での最近傍の「平面」は右端境界４２０である。従って、頂点Ｄは（ｘｍａｘＤ，ｙｍａｘＤ）としてエンコードされ、これらの座標はそれぞれ上部境界４１０および右端境界４２０からの距離を表す。その後、各座標に最近傍の境界を識別する１ビットが追加されてよい。追加のビットは、第１座標の場合、上部境界または下部境界のいずれかを意味し、第２座標の場合、右境界または左境界のいずれかを意味する。
【００１７】
頂点データのデコーディングは本質的に、各コンポーネントに必要なビット数の読み取りおよび頂点データのデコーディングであってよい。
【００１８】
簡潔さと説明の容易さを目的に、図４では二次元モデルを図示することが理解されるべきである。この例は、境界が線分ではなく平面である三次元モデルへも拡張可能である。ある頂点をエンコードする場合、ｘ座標およびｙ座標に加えてｚ座標も関与する。
【００１９】
＜三角形の接続性＞
三角形の接続性もモデル化が可能であり、これにはいくつかの方法がある。ある方法では、共有の頂点を重複させて、１個の三角形について３つの頂点位置が格納されてよい。図４のリーフの例では、頂点位置シーケンス｛ＡＢＥ，ＥＢＤ，ＣＥＤ｝が直接エンコードされてよい。別の方法では、頂点位置のアレイを格納し、その後１個の三角形について３つのインデックスを格納してよい。インデックスは、アレイ内で識別される頂点位置を示してよい。図４の例では、頂点データとして｛ＡＢＣＤＥ｝が格納されてよい。インデックスは、例えば第１の識別された頂点（Ａ）は０、第２の識別された頂点（Ｂ）は１などと定義されてよい。この結果、｛［０，１，４］，［４，１，３］，［２，４，３］｝を用いて三角形が指定されてよい。例えば、［０，１，４］は三角形ＡＢＥを表す。
【００２０】
三角形の接続性をモデル化する別の方法としては、隣接する三角形をストリップとして捉える方法がある。ストリップまたはインデックス化されたストリップを利用することで、リーフサイズおよびデコーディング時間を低減する機会がもたらされる場合がある。ある実施形態では、リーフに包含された三角形メッシュのストリップシステムが利用される。このようなシステムは、例えば１個の三角形が続く３個の三角形のストリップが続く４個の三角形のストリップといったリーフのメッシュレイアウトを処理可能である。この方法は自動的に作成され、次のように設計され得るルックアップテーブル（ＬＵＴ）を用いてよい。
・各リーフの三角形の最大数を例えば１４個に制限する。
・ＬＵＴの各エントリが１つのメッシュレイアウトを処理する。例えば、エントリＳＴＲＩＰ３Ｘ３＿ＳＴＲＩＰ２Ｘ３＿ＴＲＩＸ４は、３個の三角形の３つのストリップ、その後２個の三角形の３つのストリップ、その後４個の三角形からなるレイアウトを処理する。
・ストリップをサイズ順に並べ替え、エントリ数を制限する。したがって、ＳＴＲＩＰ４Ｘ１＿ＳＴＲＩＰ３Ｘ３はエントリとして正しいが、ＳＴＲＩＰ３Ｘ３＿ＳＴＲＩＰ４Ｘ１は正しくない。
・各エントリについて、三角形の数および第１の頂点のオフセットを格納する。例えば、エントリＳＴＲＩＰ３Ｘ１＿ＴＲＩＸ２は５個の三角形および５個の三角形のオフセット｛０，１，２，５，８｝からなる。
・ストリップは、三角形を交互に時計回りおよび反時計回りにする。各三角形の向きを格納する。
【００２１】
ＬＵＴはストリップまたはインデックス化されたストリップの使用に依存せずともよい。リーフが三角形ストリップを格納する場合、テーブルのオフセットが頂点位置のオフセットとなってよい。一方で、リーフがインデックス化されたストリップを格納する場合、テーブルが頂点のインデックスを提供してよい。ストリップおよびインデックス化されたストリップの両方が圧縮処理中に計算されてよく、より小さい表現のみが保存されてよい。その後リーフは、ストリップまたはインデックス化されたストリップの存在を示す追加のビットでフラグされてよい。
【００２２】
図５は、ある実施形態に係る三角形の接続性をモデリングするためのストリップの利用に関するプロセスを示す。ステップ５１０では、単一のリーフ内に含まれ得る三角形の上限数が選択されてよい。ステップ５２０では、各エントリが単一のメッシュレイアウトに対応するルックアップテーブルが作成されてよい。ステップ５３０では、サイズ別に並べられたストリップが各エントリに格納されてよい。ステップ５４０では、各エントリで三角形の数および各第１の頂点のオフセットが格納されてよい。ステップ５５０では、三角形の向きが格納されてよい。プロセスはステップ５６０で終了してよい。
【００２３】
＜デコーディング＞
特定のアーキテクチャにおけるデコーディング処理の速度を速めるべく、ある実施形態では対象のアーキテクチャの整列していないロード機能が用いられてよい。このようなアーキテクチャの一例として、ｘ８６アーキテクチャがある。ｘ８６ファミリーのチップ等は、メモリーロードについて極めて寛大であり得る。ここでは以下のように、６４ビットのクワッドワードを整列性に関わらずロードすることができる。
各頂点の表現に必要なビット数ｎについて、クワッドワードの収納可能な最大の頂点数ｐｎ＝［６４／ｎ］を計算する。
ｐｎ個の頂点の整列していないシーケンスを利用して頂点を格納する。
【００２４】
最終段階を図６の実施形態に示す。ここではｎが４４ビットであり、ｐｎが１である。４４ビットの１つの頂点がエンコードされてよく、バイトの境界までの４ビットは空白である。したがって、合計４８ビットが頂点に割り当てられる。次の頂点は、先の頂点の開始後に６バイト（４８ビット＝（８ビット／バイト）×（６バイト））にエンコードされる。
【００２５】
ｐｎ個の頂点の各シーケンスは新たなバイトで開始することから、高速な整列されていないロードがアーキテクチャでサポートされている場合には、デコーディング処理が向上する。高速なデコーディングでは、まず全ての頂点サイズｎε［１...６４］について２つの値を格納するルックアップテーブル（ＬＵＴ）が計算されてよい。ここでのｐｎはクワッドワード内に格納され得る頂点の数であり、次の頂点（または複数の頂点）の位置を基準にしてバイトで表されたｓｎをオフセットしてデコードする。
【００２６】
デコーディング処理は以下のように行われてよい。ここでのｑは、デコーディングが現在行なわれている位置からのクワッドワードである。
１．ｑからｐｎ個の頂点をデコードする。全ての頂点がｑに収容されることから、この操作にはＳＨＩＦＴ命令およびＡＮＤ命令のシーケンスが必要な場合がある。
２．ｑからｓｎバイト後に位置する次のクワッドワードをロードする。
【００２７】
デコーディング処理を向上するべく、整数ＳＩＭＤ演算が利用されてよい。ある実施形態では、ビット列からのデルタ値が取得されると、ＳＩＭＤ演算を用いたブランチレスコードが、整数スナップ済の位置を取得し、その後スナップするグリッドのセルサイズおよび原点を用いてワールド空間フローティング点の位置を計算してよい。付録Ａに頂点データのデコーディングの擬似コードの例を示す。
【００２８】
＜ＢＶＨツリーレイアウト＞
以下に、圧縮ノードおよび非圧縮ノードの両方を利用可能な２階層のＢＶＨ、境界ボックスによるメモリ消費を低減可能である階層的な量子化、ならびに子ノードに対する参照のサイズを低減可能なブロックに関するインデックスおよびブロックの割り当てについて説明する。図７に、ある実施形態に係るプロセスを示す。ステップ７１０では、子の境界ボックス、つまり子ノードの位置が階層的なエンコーディングを用いて表されてよい。子の境界ボックスの最小位置および最大位置は、これらの親ノードに相対して表されてよい。子の境界ボックスの角の位置が、親ボックスの点、例えば原点に対するオフセットを用いて定義されてよい。子の境界ボックスの各コンポーネントのエンコードに４ビットのみが利用できる場合、境界ボックスのメモリフットプリントは２４ビットである。ある実施形態では、ノード毎に４バイト（３２ビット）を用いることから、子ノードのインデックス化および以下に詳述する追加情報のエンコードには８ビットを利用可能である。
【００２９】
ステップ７２０では、子ノードがブロックとしてグループ化されてよい。図８の実施形態が示すように、２つのインデックス化システムが利用されてよい。ブロック内では、子が少数のビットを用いてインデックス化されてよい。図８では、例えばルートノードＲから複数のノードＮをインデックス化するべく、少数のインデックスが用いられてよい。現在のブロック外の子を参照するには、専用のフォワードノードに４バイトの整数が格納されてよい。図では、フォワードノードＦはボトムノードＢによって参照されてよい。フォワードノードＦ自身がそれぞれのサブツリーのルートであるブロックルートＲを参照してよい。
【００３０】
このレイアウトを利用して、４バイトノードの形式は以下のように構築されてよい。
・境界ボックスに２４ビットを用いてよい（付録Ｂを参照）。
・子ノードのインデックス化に６ビットを用いてよい。
・２つの子をソートする場合に必要となり得る３つの内部ノードの種類Ｘ、Ｙ、Ｚをリーフノードと区別するために２ビットを用いてよい。
【００３１】
ステップ７３０では、リーフデータがツリーノードとインターリーブされてよい。三角形のインデックスまたは頂点位置等のリーフデータをインデックス化する際に、１つ以上の４バイトのインデックスを用いることは無駄である場合がある。図８の実施形態が示すように、リーフデータとツリーノードとをインターリーブすることで、外部アレイへの参照を回避できる場合がある。各ブロックの後にリーフデータを待機状態とすることで、リーフデータはメモリ内のリーフ位置に相対してインデックス化され得る。
【００３２】
ステップ７４０では、ＢＶＨの下部ノードが圧縮され、上部ノードの少なくとも一部は圧縮されないままであってよい。トップノードはレイの大部分によってトラバースされることから、メモリのフットプリントを小さく保ちつつ、性能への影響を抑えることが可能である。
【００３３】
プロセスはステップ７５０で終了してよい。
【００３４】
＜実装＞
前述したプロセスはハードウェア、ファームウェア、またはソフトウェア、あるいは一部の組み合わせによって実装されてよい。さらに、ここに開示した１つ以上の特徴は、ディスクリート回路ロジックおよびＩＣロジック、ＡＳＩＣロジック、およびマイクロコントローラを含むハードウェア、ソフトウェア、ファームウェアおよびこれらの組み合わせによって実装されてよく、またドメイン特化したＩＣパッケージの一部またはＩＣパッケージの組み合わせとして実装されてよい。ここで用いられる用語ソフトウェアとは、ここに開示した１つ以上の機能および／または機能の組み合わせをコンピュータシステムに実行させるコンピュータプログラムロジックを格納したコンピュータ可読媒体を含むコンピュータプログラム製品を示す。コンピュータプログラム製品は、例えばコンパクトディスク、フラッシュメモリ、ＲＯＭ、または他の不揮発性メモリデバイスを含んでよい。
【００３５】
図９は、前述したプロセスのソフトウェアまたはファームウェアによる実施形態を示す。システム９００は、プロセッサ９２０と、コンピュータプログラムロジック９４０を格納可能な１つ以上のコンピュータ可読媒体を含んでよいメモリ本体９１０とを備えてよい。メモリ９１０は、例えばハードディスクおよびドライブ、コンパクトディスク等の着脱可能媒体およびドライブ、またはＲＯＭデバイスとして実装されてよい。プロセッサ９２０およびメモリ９１０は、例えばバス等の当業者によって知られている複数の技術のうちいずれかを用いて通信してよい。メモリ９１０内に含まれるロジックは、プロセッサ９２０によって読み取られ、実行されてよい。集合的にＩ／Ｏ９３０として示された１つ以上のＩ／Ｏポートおよび／またはＩ／Ｏデバイスもまた、プロセッサ９２０およびメモリ９１０に接続されてよい。
【００３６】
ある実施形態では、コンピュータプログラムロジックがモジュール９５０〜９７０を含んでよい。グリッドロジック９５０は、三角形がスナップされるようにグローバルグリッドで三角形の量子化を行なってよい。エンコーディングロジック９６０は、前述のように頂点位置をビット列にエンコード、および三角形の接続性をエンコードしてよい。ＢＶＨロジック９７０は、前述のようにコンパクトなＢＶＨを構築してよい。
【００３７】
機能、特徴および関係を示す機能的な構造ブロックを用いて方法およびシステムを開示した。これらの機能的な構造ブロックの境界の少なくとも一部は、説明の便宜上、任意に定義されている。指定された機能および関係が適切に実行される限り、別の境界が定義され得る。
【００３８】
以上に様々な実施形態を開示したが、これらは例示的に示されており限定的なものではないことが理解されるべきである。以上に開示した方法およびシステムの趣旨および範囲から逸脱することなく、形式および詳細を多様に変更可能であることは、当業者にとって明らかである。したがって、請求項の範囲および広さは以上に開示したいかなる例示的な実施形態によっても限定されるべきではない。
【付録Ａ】
【００３９】
＜頂点データの高速デコーディング＞
／／３バイトの圧縮済ＡＡＢＢ。各コンポーネントに４ビットが使用されている。
struct CAABB {
void decode(aos3f pMin,  aos3f pMax,
aos3f &tMin, aos3f &tMax) const;
／／各コンポーネントに最小値／最大値を格納。
uint8_t pMinMax[3];
／／８ビットの最小値／最大値をフロートへ変換。
static const float dLUTMinMax[256][2];
};
／／ＳＳＥ４．１命令を用いて高速ギャザー。
FINLINE aos3f
aos3f::gather(const float *x, const float *y, const float *z) {
aos3f to;
to.vec = _mm_load_ss(x);
to.vec = _mm_castsi128_ps(_mm_insert_epi32(
_mm_castps_si128(to.vec), *((int *) y), 1));
to.vec = _mm_castsi128_ps(_mm_insert_epi32(
_mm_castps_si128(to.vec), *((int *) z), 2));
return to;
}
／／ＳＳＥハンドコードのギャザーを用いて高速復元。
FINLINE void
CAABB4::decode(aos3f pMin, pMax, aos3f &tMin, aos3f &tMax) const
{
const aos3f ext = pMax - pMin;
const float *x = dLUTMinMax[this->pMinMax[0]];
const float *y = dLUTMinMax[this->pMinMax[1]];
const float *z = dLUTMinMax[this->pMinMax[2]];
const aos3f deltaMin = aos3f::gather(x, y, z);
const aos3f deltaMax = aos3f::gather(x + 1, y + 1, z + 1);
const aos3f tmpMin = pMin + ext * deltaMin;
const aos3f tmpMax = pMin + ext * deltaMax;
tMin = tmpMin;
tMax = tmpMax;
}
【付録Ｂ】
【００４０】
＜圧縮ノードの高速デコーディング＞
／／３バイトの圧縮済ＡＡＢＢ。各コンポーネントに４ビットが使用されている。
struct CAABB {
void decode(aos3f pMin,  aos3f pMax,
aos3f &tMin, aos3f &tMax) const;
／／各コンポーネントに最小値／最大値を格納。
uint8_t pMinMax[3];
／／８ビットの最小値／最大値をフロートへ変換。
static const float dLUTMinMax[256][2];
};
／／ＳＳＥ４．１命令を用いて高速ギャザー。
FINLINE aos3f
aos3f::gather(const float *x, const float *y, const float *z) {
aos3f to;
to.vec = _mm_load_ss(x);
to.vec = _mm_castsi128_ps(_mm_insert_epi32(
_mm_castps_si128(to.vec), *((int *) y), 1));
to.vec = _mm_castsi128_ps(_mm_insert_epi32(
_mm_castps_si128(to.vec), *((int *) z), 2));
return to;
}
／／ＳＳＥハンドコードのギャザーを用いて高速復元。
FINLINE void
CAABB4::decode(aos3f pMin, pMax, aos3f &tMin, aos3f &tMax) const
{
const aos3f ext = pMax - pMin;
const float *x = dLUTMinMax[this->pMinMax[0]];
const float *y = dLUTMinMax[this->pMinMax[1]];
const float *z = dLUTMinMax[this->pMinMax[2]];
const aos3f deltaMin = aos3f::gather(x, y, z);
const aos3f deltaMax = aos3f::gather(x + 1, y + 1, z + 1);
const aos3f tmpMin = pMin + ext * deltaMin;
const aos3f tmpMax = pMin + ext * deltaMax;
tMin = tmpMin;
tMax = tmpMax;
}
【図１】
2011081788.tif 000003
【図３】
2011081788.tif 000004
【図５】
2011081788.tif 000005
【図７】
2011081788.tif 000006
【図９】
2011081788.tif 000007
【図２】
2011081788.tif 000008
【図４】
2011081788.tif 000009
【図６】
2011081788.tif 000010
【図８】
2011081788.tif 000011
【手続補正書】
【提出日】平成22年9月16日(2010.9.16)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
隣接する三角形が共にスナップされるように、シーンの三角形をグローバルグリッド上で量子化する段階と、
可変長のビット列として前記三角形の頂点位置をエンコードする段階と、
前記三角形の接続性をモデリングする段階と、
前記シーンの少なくとも一部を表すコンパクトな境界ボリューム階層（ＢＶＨ）を構築する段階と
を備え、
グラフィックス処理を実行するプロセッサによって実行される方法。
【請求項２】
前記頂点位置をエンコードする段階は、
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離を記述するデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算する段階と、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定する段階と、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするのに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定する段階と、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードする段階と
を有し、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１に記載の方法。
【請求項３】
前記頂点位置をエンコードする段階は、
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離を記述するデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算する段階と、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定する段階と、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定する段階と、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードする段階と、
ｘｉ、ｙｉおよびｚｉのそれぞれに前記境界ボックスの最近傍の平面を識別する追加の１ビットを加える段階と
を有し、
前記Ｄｉの各コンポーネントは、前記頂点を含む前記最近傍の平面から前記頂点までの距離を前記コンポーネントの次元と共に示し、前記最近傍の平面は、前記次元に垂直であり、原点を含む平面または前記原点を含む前記平面に対向する平面のいずれかであり、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１に記載の方法。
【請求項４】
前記接続性をモデリングする段階は、前記三角形それぞれの各頂点を識別する段階を有し、前記三角形の１つの頂点が複数の三角形の頂点である場合は、前記頂点は前記複数の三角形のそれぞれについて個別に識別される請求項１に記載の方法。
【請求項５】
前記接続性をモデリングする段階は、
各頂点を１回識別する段階と、
インデックスをそれぞれ頂点に関連付ける段階と、
前記三角形の３つの頂点のそれぞれに関連付けられた３つのインデックスをリストすることで前記三角形をそれぞれに識別する段階と
を有する請求項１に記載の方法。
【請求項６】
前記接続性をモデリングする段階は、
前記ＢＶＨ内のリーフ毎の三角形の最大数を指定する段階と、
ルックアップテーブル（ＬＵＴ）を構築する段階と、
前記ＬＵＴの各エントリについて、前記三角形の数および前記三角形それぞれの第１の頂点のオフセットを格納する段階と、
前記三角形それぞれの方向を格納する段階と
を有し、前記ＬＵＴの各エントリはストリップ群に関連付けられ、前記ストリップのそれぞれは、１個以上の隣接する三角形のシーケンスを含み、１個の三角形は前記ＬＵＴに１回のみ現れる請求項１に記載の方法。
【請求項７】
前記コンパクトなＢＶＨを構築する段階は、
各子ノードについて、関連付けられた親ノードの境界ボリュームを基準にして指定された境界ボリュームを定義する段階と、
複数の子ノードをブロックにグループ化する段階と、
前記ブロックのそれぞれについて、前記ブロック内の各子ノードのインデックスを定義する段階と、
リーフを含むブロックそれぞれについて、前記ブロックに関連付けられたリーフデータを前記ブロックの後にリストする段階と、
下部ノードを圧縮形式で格納し、上部ノードの少なくとも一部を非圧縮形式で格納する段階と
を有する請求項１に記載の方法。
【請求項８】
前記ブロック内の子ノードは、フォワーディングノードが前記子ノードの従属サブツリーを指すように前記フォワーディングノードにマッピングされ、前記サブツリーは、異なるブロックに存在する請求項７に記載の方法。
【請求項９】
プロセッサと、
前記プロセッサと通信するメモリとを備えるシステムであって、
前記メモリは複数の処理命令を格納し、前記複数の処理命令は前記プロセッサに、
隣接する三角形が共にスナップされるようにシーンの複数の三角形をグローバルグリッド上で量子化させ、
前記三角形の頂点位置を可変長のビット列としてエンコードさせ、
前記三角形の接続性をモデリングさせ、
前記シーンの少なくとも一部を表すコンパクトな境界ボリューム階層（ＢＶＨ）を構築させるための処理命令である
システム。
【請求項１０】
前記プロセッサに頂点位置をエンコードするように指示する前記命令は、前記プロセッサに
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離であるデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させ、
前記境界ボックスの全ての頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させ、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定させ、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードさせるための命令を有し、
前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項９に記載のシステム。
【請求項１１】
前記プロセッサに頂点位置をエンコードするように指示する前記命令は、前記プロセッサに
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離であるデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させ、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させ、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定させ、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードさせ、
ｘｉ、ｙｉおよびｚｉに最近傍の平面を識別する追加の１ビットを加えさせるための命令を有し、
前記Ｄｉの各コンポーネントは、前記頂点を含む前記境界ボックスの前記最近傍の平面から前記頂点までの距離を前記コンポーネントの次元と共に示し、前記最近傍の平面は、前記次元に垂直であり、原点を含む平面または前記原点を含む前記平面に対向する平面のいずれかであり、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項９に記載のシステム。
【請求項１２】
前記プロセッサに接続性をモデリングするように指示する前記命令は、前記プロセッサに
前記三角形それぞれの各頂点を識別させるための命令を有し、前記三角形の１つの頂点が複数の三角形の頂点である場合は、前記頂点は前記複数の三角形のそれぞれについて個別に識別される請求項９に記載のシステム。
【請求項１３】
前記プロセッサに接続性をモデリングするように指示する前記命令は、前記プロセッサに
各頂点を１回識別させ、
インデックスをそれぞれ頂点に関連付けさせ、
前記三角形の３つの頂点のそれぞれに関連付けられた３つのインデックスをリストすることで前記三角形をそれぞれに識別させるための命令を有する請求項９に記載のシステム。
【請求項１４】
前記プロセッサに接続性をモデリングするように指示する前記命令は、前記プロセッサに、
前記ＢＶＨ内のリーフ毎の三角形の最大数を指定させ、
ルックアップテーブル（ＬＵＴ）を構築させ、
各エントリについて、前記三角形の数および前記三角形それぞれの第１の頂点のオフセットを格納させ、
前記三角形それぞれの方向を格納させるための命令を有し、
前記ＬＵＴの各エントリはストリップ群に関連付けられ、前記ストリップのそれぞれは、１個以上の隣接する三角形のシーケンスを含み、１個の三角形は前記ＬＵＴに１回のみ現れる請求項９に記載のシステム。
【請求項１５】
前記プロセッサに前記コンパクトなＢＶＨを構築するように指示する前記命令は、前記プロセッサに
各子ノードについて、関連付けられた親ノードの境界ボリュームを基準にして指定された境界ボリュームを定義させ、
複数の子ノードをブロックにグループ化させ、
前記ブロックのそれぞれについて、前記ブロック内の各子ノードのインデックスを定義させ、
リーフを含むブロックそれぞれについて、前記ブロックに関連付けられたリーフデータを前記ブロックの後にリストさせ、
下部ノードを圧縮形式で格納し、上部ノードの少なくとも一部を非圧縮形式で格納させるための命令を有する請求項９に記載のシステム。
【請求項１６】
前記ブロック内の子ノードは、フォワーディングノードが前記子ノードの従属サブツリーを指すように前記フォワーディングノードにマッピングされ、前記サブツリーは、異なるブロックに存在する請求項１５に記載のシステム。
【請求項１７】
コンピュータに、
グローバルグリッド上でシーンの複数の三角形を隣接する複数の三角形が一緒にスナップされるように量子化させる手順と、
前記複数の三角形の頂点位置を可変長のビット列としてエンコードさせる手順と、
前記複数の三角形の接続性をモデル化させる手順と、
前記シーンの少なくとも一部を表すコンパクトな境界ボリューム階層（ＢＶＨ）を構築させる手順と
を実行させるためのプログラム。
【請求項１８】
前記頂点位置を前記プロセッサにエンコードさせる前記手順は、
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離を記述するデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させる手順と、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させる手順と、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を前記プロセッサに決定させる手順と、
前記ビット数（ｎｘ，ｎｙ，ｎｚ）をエンコードさせる手順と
を有し、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１７に記載のプログラム。
【請求項１９】
前記頂点位置を前記プロセッサにエンコードさせる前記手順は、
各頂点ｉについて、前記頂点を含む境界ボックスの原点からの距離を記述するデルタベクトルＤｉ＝｛ｘｉ，ｙｉ，ｚｉ｝を計算させる手順と、
前記境界ボックス内の全ての前記頂点について、前記頂点それぞれの前記デルタベクトルのうち、最大のｘ、ｙおよびｚコンポーネント、ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）を決定させる手順と、
前記ｍａｘ（ｘｉ）、ｍａｘ（ｙｉ）およびｍａｘ（ｚｉ）をそれぞれエンコードするに必要なビット数（ｎｘ，ｎｙ，ｎｚ）を決定させる手順と、
前記（ｎｘ，ｎｙ，ｎｚ）をエンコードさせる手順と、
ｘｉ、ｙｉおよびｚｉに最近傍の平面を識別する追加の１ビットを加えさせる手順と
を有し、
前記Ｄｉの各コンポーネントは、前記頂点を含む前記境界ボックスの前記最近傍の平面から前記頂点までの距離を前記コンポーネントの次元と共に示し、前記最近傍の平面は、前記次元に垂直であり、前記原点を含む平面または前記原点を含む前記平面に対向する平面のいずれかであり、前記エンコードされた（ｎｘ，ｎｙ，ｎｚ）に前記頂点の前記デルタベクトルが続く請求項１７に記載のプログラム。
【請求項２０】
前記接続性をモデリングさせる前記手順は、前記三角形それぞれの各頂点を識別させる手順を有し、前記三角形の１つの頂点が複数の三角形の頂点である場合は、前記頂点は前記複数の三角形のそれぞれについて個別に識別される請求項１７に記載のプログラム。
【請求項２１】
前記接続性をモデリングさせる前記手順は、
各頂点を１回識別させる手順と、
インデックスをそれぞれ頂点に関連付けさせる手順と、
前記三角形の３つの頂点のそれぞれに関連付けられた３つのインデックスをリストすることで前記三角形をそれぞれに識別させる手順と
を有する請求項１７に記載のプログラム。
【請求項２２】
前記接続性をモデリングさせる手順は、
前記ＢＶＨ内のリーフ毎の三角形の最大数を指定させる手順と、
ルックアップテーブル（ＬＵＴ）を構築させる手順と、
各エントリについて、前記三角形の数および前記三角形それぞれの第１の頂点のオフセットを格納させる手順と、
前記三角形それぞれの方向を格納させる手順と
を有し、前記ＬＵＴの各エントリはストリップ群に関連付けられ、前記ストリップのそれぞれは、１個以上の隣接する三角形のシーケンスを含み、１個の三角形は前記ＬＵＴに１回のみ現れる請求項１７に記載のプログラム。
【請求項２３】
前記コンパクトなＢＶＨを構築させる前記手順は、
各子ノードについて、関連付けられた親ノードの境界ボリュームを基準にして指定された境界ボリュームを定義させる手順と、
複数の子ノードをブロックにグループ化させる手順と、
前記ブロックのそれぞれについて、前記ブロック内の各子ノードのインデックスを定義させる手順と、
リーフを含むブロックそれぞれについて、前記ブロックに関連付けられたリーフデータを前記ブロックの後にリストさせる手順と、
下部ノードを圧縮形式で格納し、上部ノードの少なくとも一部を非圧縮形式で格納させる手順と
を有する請求項１７に記載のプログラム。
【請求項２４】
前記ブロック内の子ノードは、フォワーディングノードが前記子ノードの従属サブツリーを指すように前記フォワーディングノードにマッピングされ、前記サブツリーは、異なるブロックに存在する請求項２３に記載のプログラム。
【外国語明細書】
2011081788000001.pdf