以下の発明を実施するための形態は、本発明のある特定の実施形態に関する。しかしながら、本発明は多数の様々な方法で具現化され得る。本明細書の態様は多種多様な形で具現化され得ること、および本明細書で開示されている任意の特定の構造、機能または両方は代表的なものにすぎないことは明らかであろう。本明細書の教示に基づいて、本明細書で開示される態様は他の任意の態様から独立して実装でき、これらの態様のうちの2つ以上は様々な方法で結合できることを、当業者は諒解されよう。たとえば、本明細書に記載された任意の数の態様を使用して、装置を実装することができるか、または方法を実施することができる。さらに、他の構造、機能性、または、本明細書に記載された態様のうちの1つもしくは複数に加えて、または、それら以外の構造および機能性を使用して、そのような装置を実装することができるか、またはそのような方法を実施することができる。
レイトレーシングは、レイ(それらのオリジンおよび方向によって定義される)が、レイ-オブジェクト交差を識別するためにシーンプリミティブのセットを介してトレースされるコンピュータグラフィックス技法である。レイトレーサは、シーン内のオブジェクトの空間関係を特徴付けるために加速データ構造(階層)を使用する。いくつかの実装形態は、階層の上部におけるルートノードと、空間に境界をつけられた領域を表す内部ノードと、空間に境界をつけられた領域を表すリーフノードとを、それらのノードの中に含まれるプリミティブのセットとともに有するバイナリツリーであり得るバウンディングボリューム階層(BVH)ツリーを使用する。いくつかの態様では、表面領域ヒューリスティック(SAH)が、階層を構築するために使用され得る。加速データ構造は、領域に境界をつけるために、軸平行なバウンディングボックス(AABB)を使用し得る。領域に境界をつけるためおよびレイ-オブジェクト交差テストを行うためにAABBを使用するBVHツリーを横断する計算の複雑さは、ツリー内のノード数に対して対数で表される。
単一の画像をレイトレーシングでレンダリングすることは、数百万のレイ/オブジェクト交差テストを必要とする場合がある。交差テストの数の大幅な低減は、画像をレンダリングするのにかかる時間を著しく低減し得る。たとえば、交差テストの数を40%減少させると、画像をレンダリングするための時間を約40%だけ低減することができる。本明細書で開示される方法、装置およびシステムを使用して階層のルートノードの代わりに非ルートノードにおいて階層横断プロセスを開始することで、交差テストの数が10%、30%、50%だけ、またはそれ以上に低減され、画像をレンダリングするのにかかる時間が著しく低減される場合がある。
加速データ構造横断アルゴリズムは、レイコヒーレンシを活用することによって、またはノードをキャッシュフレンドリーなレイアウト内に編成することによって、より効率的なツリー構造を介して最適化され得る。これらの手法は、BVHツリー、KDツリー、または他のグリッド構造もしくはツリー構造に適用され得る。既存の実施態様における横断アルゴリズムは、ツリーのルートノード(または階層のハイアラーク(hierarch))において開始し、シーンの空間の全ボリュームをカバーするために全ツリー(階層)を横断する。本明細書で開示される方法、装置およびシステムは、代わりに、全ツリーではなくツリーの一部分だけを横断してよい横断アルゴリズムを提供する。これらの方法、装置およびシステムは、加速データ構造を横断することを開始するために非ルート開始ノードを決定する。
図1は、三角形プリミティブによって表される頭と肩とを含むシーンを示す。ビデオゲーム、フィルムプロダクション、バーチャルリアリティ、トレーニングおよび拡張現実を含むアプリケーションのためのコンピュータ生成画像(CGI)は、オブジェクトを含むシーンの画像をレンダリングするためにレイトレーシングを使用する。オブジェクトは、オブジェクト表面を近似する三角形などのプリミティブのメッシュを使用して三次元空間内に表され得る。たとえば、6つのフラットで正方形の側面を有するダイは、ダイのコーナーに対応する頂点を有する12の三角形のメッシュによってモデル化され得る。ダイの側面は平坦であり、各側面は正方形であるので、比較的少ないプリミティブが、三次元空間内のダイをモデル化するのに必要とされる。対照的に、図1の頭および肩100の表面は湾曲し、傾斜しているので、画像を表す曲がりおよび角度を近似するために数百または数千のプリミティブを必要とする。個別の三角形が肩および額付近で視認可能であるが、目または耳の曲がりおよびくぼみを表すために、より高密度のプリミティブのセットが必要とされる。図1に示す各プリミティブは、各プリミティブの三角形を形成する頂点の空間座標によって特徴付けられ得る。
図2は、コンピュータグラフィックスを使用してレンダリングされたティーポットを示す。図2のティーポット200は、取っ手210、注ぎ口230、ふた240、ふたの取っ手245および湾曲した容器220を含む。ティーポット200をコンピュータグラフィックスシステム内で表すことは、ティーポットの連続面を近似し、したがって取っ手210、注ぎ口230、ふた240および湾曲した容器220のレンダリングを可能にするために、数百または数千のプリミティブを必要とする場合がある。
図3は、図2のティーポットをモデル化するために使用される1次レイとシャドーレイとを示す。レイトレーシング方法は、開始点から、一般的には図3の観測者350からなど、シーンの閲覧パースペクティブから1次レイを投影するために光学原理を使用する。各レイは、画像平面に交差してよく、および/またはオブジェクト(またはオブジェクトプリミティブ)に交差してよい。1次レイは、観測者(カメラ)において開始し、1次レイがシーン内のオブジェクトに交差するときに終了する。たとえば、図3において、1次レイ371は観測者350から開始して湾曲した容器220の下側部分に交差し、レイ372は注ぎ口230に交差し、1次レイ373は同様に観測者350から開始してふたの取っ手245の左方でふた240に交差し、レイ374は観測者350から開始して取っ手210の上部に交差する。
1次レイがオブジェクトに交差した後、コンピュータグラフィックス技法は、交点からシーンに対する光源へのシャドーレイを投影し得る。いくつかの場合には、光源は、シーンのデジタル画像内に示されてよく、または光源は、シーンのデジタル画像によって明示的に示されないかまたは表されない点であってもよい。図3では、シャドーレイ381、382、383および384は、それぞれレイ371、372、373および374の行き先において開始し、各シャドーレイは光源360に向けられる。ある点から光源に向かってトレースされるシャドーレイが、レイオリジンと光源との間でオブジェクトに交差しないならば、その点はシャドー内にない。少なくとも1つの交差があるならば、その点はシャドー内にある。シャドーレイ381は湾曲した容器220に交差し、それゆえそれのオリジンは光源360によって直接照らされないので、そのオリジンはシャドー内にある。同様に、シャドーレイ383はふたの取っ手245に交差し、それゆえそのオリジンは光源360によって直接照らされない。対照的に、シャドーレイ382および384は、光源360によって直接照らされる。
レイトレーシング方法は、単一の画像を生成するために数百、数千または数百万のレイをトレースする場合がある。そのようなレイトレーシング方法は、各レイをトレースするために、伝送、反射、屈折または蛍光に対する光学特性、ならびに半透明性および透明性などのオブジェクトの表面特徴の態様を適用し得る。1次レイ、シャドーレイ、反射レイ、屈折レイまたは他のタイプのレイかどうかにかかわらず、各レイは、そのレイがプリミティブに交差するかどうかを判定するためにシーン内の各プリミティブとの交差をテストされ得る。レイトレーシング方法は、レイの吸収、反射、屈折および蛍光、ならびにオブジェクト表面が透明であるかまたは半透明であるかをモデル化し得る。レイが表面に入射するとき、この入射レイは、反射レイ(反射されたレイ)として表面から反射することがあり、および/または屈折レイ(屈折されたレイ)として表面の中で屈折することがある。蛍光を発する対象物は、たとえば、紫外線放射によって励起されると、蛍光レイを放出する。単一の画像を生成することは、数千または数百万のレイ-オブジェクト(レイ-プリミティブ)交差テストを必要とすることがあり、レイトレーシングは、計算集約型で遅いことがある。レイトレーシングおよびシーンレンダリングのために最適化されたグラフィックプロセッサユニット(GPU)などの専用ハードウェアは、シーンに対してレイをトレースし、画像をレンダリングするのにかかる時間を低減し得る。
図4は、シーンの一部を分割するバウンディングボリュームを示し、バウンディングボリュームは、シーン内の表面の部分を表すプリミティブを含む。いくつかの態様では、図示されたバウンディングボリュームは、図1または図2A〜図2Bに示すシーンを分割し得る。図4は、バウンディングボリューム56A〜56E(バウンディングボリューム56)を示す。バウンディングボリューム56は、囲まれたプリミティブのすべての点がその中に存在し得る最小の領域またはボリュームを有するバウンディングボックスである場合がある、軸平行なバウンディングボックス(AABB)である場合がある。実際のシーンは、数百、数千、またはそれ以上のプリミティブを含む場合があるが、明快のために5つの三角形プリミティブ52A〜52Eが図4に図示されている。バウンディングボックスは、これらのボックスの辺が座標軸(たとえば、x軸、y軸、およびz軸)に平行であり得るように軸平行であり得る。いくつかの態様では、バウンディングボックスは、直方体の形状を有する場合がある。
バウンディングボリューム56Aは、たとえば、シーン100または200のすべてのプリミティブ52に境界をつけるバウンディングボックスである場合がある。バウンディングボリューム56Bおよび56Cは、バウンディングボリューム56Aによって境界をつけられたシーン50の一部分のサブセットに境界をつけるという点で、バウンディングボリューム56Aのサブセットであり得る。バウンディングボリューム56Bは、プリミティブ52Aおよび52Bに境界をつける場合があり、バウンディングボリューム56Cは、プリミティブ52C、52D、および52Eに境界をつける場合がある。バウンディングボリューム56Dおよび56Eは、バウンディングボリューム56Cのサブセットである場合があり、バウンディングボリューム56Cによって境界をつけられたシーン50の一部分のサブセットに境界をつける場合がある。バウンディングボリューム56Dは、プリミティブ52Cおよび52Dに境界をつける場合があり、バウンディングボリューム56Eは、プリミティブ52Eに境界をつける場合がある。
図4に示す例では、プリミティブ52は、5つのバウンディングボリューム56に区分される。5つより多い、または少ないバウンディングボリューム56が、シーンを区分するために使用されてよい。たとえば、追加のバウンディングボリュームが、プリミティブ52Aおよび52Bにそれぞれ個別に境界をつけるためにバウンディングボリューム56Bのサブセットとして生成されてもよい。いくつかの例では、CPU6が、同様に、プリミティブ52をバウンディングボリューム56に区分するように構成されてもよい。
図5は、図4に示すバウンディングボリューム56およびプリミティブ52に関連付けられたノードを有する例示的な階層データ構造体60を示す。加速階層データ構造60は、レイ-プリミティブ交差を判定するために横断される場合がある。バウンディングボリューム56およびプリミティブ52は、たとえば、シーン100または200の一方を表しているバウンディングボリューム階層(BVH)ツリー60のノードと関連付けられる場合がある。BVHツリー60は、シーン50内のバウンディングボリューム56およびプリミティブ52に関連付けられたノード62A〜62E(「ノード62」)を含む場合がある。より具体的には、ルートノード62A、内部ノード62C、ならびにリーフノード62B、62D、および62Eは各々、複数のバウンディングボリューム56のうちの1つのバウンディングボリュームに関連付けられる場合がある。ルートノード62A以外のBVHツリー60のノードは、BVHツリー60の非ルートノードと呼ばれる場合がある。たとえば、内部ノード62C、ならびにリーフノード62B、62D、および62Eは、BVHツリー60の非ルートノードと呼ばれる場合がある。リーフノード62B、62D、および62Eは各々、複数のプリミティブ52のうちの少なくとも1つのプリミティブにリンクされる場合がある。たとえば、リーフノード62Bは、プリミティブ52Aおよび52Bにリンクされる場合があり、リーフノード62Dは、プリミティブ52Cおよび52Dにリンクされる場合があり、リーフノード62Eは、プリミティブ52Eにリンクされる場合がある。BVHツリー60は、不平衡なバイナリツリーと見なされる場合があるが、その理由は、階層データ構造体60の各非リーフノードが多くて2つの子ノードを有し、リーフノード62B、62D、および62Eが等しくない深さを有する場合があるからである。
バウンディングボリューム56Aがシーン50のすべてのプリミティブ52に境界をつけるので、GPU12は、ルートノード62Aをバウンディングボリューム56Aに関連付け得る。GPU12は、ルートノード62Aの子ノードであるノード62Bおよび62Cを、それぞれバウンディングボリューム56Bおよび56Cに関連付け得るが、その理由は、バウンディングボリューム56Bおよび56Cが各々、バウンディングボリューム56Aのサブセットであるからである。GPU12は、プリミティブ52Aおよび52Bをノード62Bにリンクさせる場合があるが、その理由は、ノード62Bに関連付けられたバウンディングボリューム56Bがプリミティブ52Aおよび52Bに境界をつけ、バウンディングボリューム56Bのサブセットである追加のバウンディングボリュームが存在しないからである。
バウンディングボリューム56Dおよび56Eは、ノード62Cの子ノードであるノード62Dおよび62Eに関連付けられてよく、その理由は、バウンディングボリューム56Dおよび56Eが各々、ノード62Cに関連付けられたバウンディングボリューム56Cのサブセットであるからである。プリミティブ52Cおよび52Dは、ノード62Dとリンクされる場合があるが、その理由は、ノード62Dに関連付けられたバウンディングボリューム56Dがプリミティブ52Cおよび52Dに境界をつけるので、バウンディングボリューム56Dのサブセットである追加のバウンディングボリュームが存在しないからである。プリミティブ52Eは、ノード62Eとリンクされる場合もあるが、その理由は、ノード62Eに関連付けられたバウンディングボリューム56Eがプリミティブ52Eに境界をつけるので、バウンディングボリューム56Eのサブセットである追加のバウンディングボリュームが存在しないからである。
BVHツリー60は、BVHツリー60のノード62に関連付けられたバウンディングボリューム56に対してレイ-ボックス交差テストを実行することによってレイ54に交差する複数のプリミティブ52のうちの1つのプリミティブを決定するように横断する場合がある。BVHツリー60の横断が、ルートノード62Aに関連付けられたバウンディングボリューム56Aに対してレイ-ボックス交差テストを実行することによって開始する場合がある。レイ54がバウンディングボリューム56Aに交差する場合、横断は、ノード62Bに関連付けられたバウンディングボリューム56Bに対してレイ-ボックス交差テストを実行することによってノード62Bによって継続する場合がある。レイ54がバウンディングボリューム56Bに交差しない場合、横断は、上方にノード62Aまで、下方にノード62Cまで再帰的に継続する場合があり、レイ-ボックス交差テストは、ノード62Cに関連付けられたバウンディングボリューム56Cに対して実行される場合がある。レイ54がバウンディングボリューム56Cに交差すると判定される場合、横断は、ノード62Dで継続する場合があり、レイ-ボックス交差テストが、ノード62Dに関連付けられたバウンディングボリューム56Dに対して実行される場合がある。レイ54がバウンディングボリューム56Dに交差する場合、レイ-プリミティブ交差テストは、ノード62Dにリンクされたプリミティブに対して実行される場合がある。それゆえ、レイ-プリミティブ交差テストは、プリミティブ52Cとプリミティブ52Dとに対して実行される場合がある。プリミティブ52Dに対するレイ-プリミティブ交差テストから、レイ54がプリミティブ52Dに交差すると判定される場合がある。レイ54がプリミティブ52Dに交差すると判定した後、横断は、上方にノード62Cまで、下方に62Eまで再帰的に継続してよく、レイ-ボックス交差テストは、ノード62Eに関連付けられたバウンディングボリューム56Eに対して実行されてよい。レイ-ボックス交差テストに基づいて、レイ54がバウンディングボリューム56Eに交差しないと判定される場合があり、それによって、レイ54に関するBVHツリー60の横断を終了する。
BVHツリー60が、内部ノード62Cまたはリーフノード62B、62Dおよび62Eなど、非ルートノードから開始して横断され得る場合、レイに交差するすべてのプリミティブを発見するために実行されるレイ交差テストの数は、BVHツリー60の横断がルートノード62Aから開始する場合より大幅に小さくなる場合がある。したがって、レイによって交差されるプリミティブのセットを決定する効率は、改善される場合がある。GPU12は、レイ54がBVHツリー60の非ルートノードに関連付けられたバウンディングボリュームに交差すると判定することによってBVHツリー60の非ルートノードからBVHツリー60の横断を開始する場合がある。
図6Aは、図2および図3のティーポットのシーンに対するバウンディングボリューム階層(BVH)ツリー610を示す。BVHツリー内の各ノードは、三次元空間内のボリュームを占有するシーンの一部分と関連付けられる。BVHツリー(階層)610は、ルートノードN1、内部ノードN2〜N7およびリーフノードN8〜N15を含む。ノードN1は、ノードN2およびN3に対する親ノードである。ノードN2は、ノードN4およびN5に対する親ノードである。ノードN3は、ノードN6およびN7に対する親ノードである。ノードN4は、ノードN8およびN9に対する親ノードである。ノードN5は、ノードN10およびN11に対する親ノードである。ノードN6は、ノードN12およびN13に対する親ノードである。ノードN7は、ノードN14およびN15に対する親ノードである。BVHツリー610は一例として働くが、他のバウンディングボリューム階層が、数百、数千またはそれ以上のノードを有する場合がある。各ノードは、ラベル、参照番号および/または色を用いて一意に識別され得る。親および子に対する他の用語は、それぞれ祖先および子孫である。
BVHツリー610が図2および図3のティーポットのシーンをどのように表すかの一例として、ルートノードN1が、全ティーポットを表す場合がある。たとえば、N1は、全ティーポットを包含する(おそらくは最小の)バウンディングボリュームと関連付けられてよい。ノードN2は、ふたの取っ手245を有するティーポットのふた240を表してよく、一方、ノードN3は、取っ手210、容器220および注ぎ口230を表してよい。ノードN2の子、ノードN4およびN5はそれぞれ、ふたの取っ手245とティーポットのふた240とを表してよい。ノードN3の子はノードN6およびN7である。ノードN6は注ぎ口230を表してよく、一方、ノードN7は取っ手210と容器220とを表してよい。ノードN8およびN9は、それぞれ、取っ手245の上部および下部を表してよい。ノードN10およびN11は、それぞれ、ティーポットのふた240の左の部分および右の部分に対応してよい。ノードN12およびN13は、注ぎ口230の開口を有する上部3分の1と下部3分の2とに対応してよい。ノードN14は取っ手210に対応してよく、一方、ノードN15は容器220に対応してよい。ノードの以後の生成は、シーンをさらに再分割する。
ルートは、階層ツリーの頂部にあると見なされてよく、ルートの各子は、それの親(ルート)より階層において「低い」。この関係は、ルートの子ノードの子に対して繰り返される。したがって、子は、階層においてそれの親ノードより1レベル深い。ルートノードは、階層において(それ自体を除いて)すべてのノードに対する祖先である。2つ以上のノードの最深の共通祖先は、依然として2つ以上のノードの各々の祖先である最深の深さを有するノードである。
ノードの子は、それぞれ、親によって表されるシーンの一部分と関連付けられる。たとえば、ルートがティーポットと関連付けられる場合、それの第1の子は、ティーポットの注ぎ口ならびにティーポットのふたの前の湾曲した容器の一部分と関連付けられてよい。第2の子は、ふた、湾曲した容器の後部およびティーポットの取っ手を含むティーポットの残りと関連付けられてよい。以後の生成は、ティーポットの表面のメッシュのプリミティブを占有し得るリーフノードに到達するまで、ティーポットをさらに分割してよい。
不規則な形状のボリュームは、たとえば、レイがボリュームを通過するかどうかを判定するために、より複雑な計算を必要とする場合があるので、計算は、規則的形状に境界をつけるバウンディングボリュームを使用して簡略化されてよい。たとえば、直方体が、ティーポットのふたまたはティーポットの注ぎ口に境界をつけてよい。いくつかの実施形態では、軸平行な平行六面体が、各ノードと関連付けられてよい。階層内の各子はそれらの親の再分割であるので、ノードの以後の生成は、シーンのより小さい部分と関連付けられる傾向があり、バウンディングボリュームは階層のより低いレベルの各々においてサイズが減少する傾向がある。
BVHツリー610の各ノードN1〜N15、または図5のBVHツリー60のノード62A〜62Eは、BVHツリー610またはBVHツリー60によって表されるシーンの三次元空間内のボリュームと関連付けられる。たとえば、親ノードN1に関連付けられたボリュームは、親ノードの任意の子N2およびN3に関連付けられたボリュームによって表される空間を包含する。したがって、親および子の関連するボリュームは、重複する場合がある。ルートノードのボリュームは、すべての他のボリュームと重複する。表面領域階層アルゴリズム(SAH)または他の方法は、BVHツリー610を生成し、ボリュームを各ノードと関連付けるために使用されてよい。各ボリュームは、計算速度を上げるために、直方体のような形状の軸平行なバウンディングボックスであってよい。
いくつかの態様では、BVHツリー610は、ルートノードN1および表されている全シーンを包含する関連するボリュームで開始して、再帰的に構築されてよい。次いで、ボリュームは、第1のボリュームによって包含される2つ以上の追加のボリュームに分割されてよく、ルートノードの子ノードは、これらの新しいボリュームと関連付けられる。次いで、これらの新しい追加のボリュームの各々は、追加の新しいボリュームを生成するためにさらに分割されてよく、追加の新しいノードは、ルートの子の子ノードとして追加される。このプロセスは、終了条件に到達するまで続いてもよい。いくつかの態様では、終了条件は、任意の1つのボリュームによって表される最小空間に関連する場合がある。いくつかの態様では、シーンを表している階層は、たとえば、数十、数百または数千のレベルを含む多くのレベルを有する場合がある。
図6Bは、図1のシーン100または図2のシーン200など、シーンを再分割するボクセルまたはボリューム要素のセット620を示す。図6Bの例示的なボクセル620は、8つのボクセルV111、V121、V211、V221、V112、V122、V212およびV222を含み、そのうちの7つは図6Bにおいて直接視認可能である。
ラスタライズされた画像平面がピクセル(グラフ用紙上のボックスのような正方形領域)に分割され得るのと同様に、シーンをボリューム要素(ボクセル)に再分割することによってシーンがボクセル化されてよい。ボクセルは、グラフ用紙上の複数のボックスが二次元内で隣接するように、三次元内で隣接する立方体ボリューム要素であってよく、ボクセルは、軸平行な側面を有する立方体であってよい。隣接するボクセルは、重複せずに隣接してよい。空間は、たとえば、空間の三次元の各々に対して163(16×16×16)、323、643、1283、または何らかの他の数のボクセルに分割されてよい。三次元の各々に対するボクセルの数が等しいことは、必要とされない。ボクセルが多くなるにつれて、空間をより精細に分割することが可能であるが、増加する計算負荷が犠牲となる。
ボクセルによって画定されたボリュームは、1つまたは複数のシーンオブジェクト表面のプリミティブを含む場合がある。また、各プリミティブは、プリミティブを含む最深ノード(いくつかの場合には、リーフノード)を含む、BVHツリー610内の少なくとも1つのノードに関連付けられた1つまたは複数のバウンディングボリューム内にあってよい。
図6Cは、図6Aのノード(右側で識別される)に対する図6Bのボクセル(左側で識別される)の例示的な関連付けを示す。ボクセルとノードとの間の関連付けは、特定のボクセル内のシーンオブジェクト表面のプリミティブが、あるノードに関連付けられたバウンディングボリューム内にあるかどうかに部分的に基づく。特に、図6Bに示すボクセルのうちの少なくともいくつかは、シーン内のオブジェクトを表す1つまたは複数のプリミティブを包含してよい。BVHツリー610内の1つまたは複数のノードは、特定のボクセルによって包含されるプリミティブを同様に包含するバウンディングボリュームを表してよい。1つまたは複数のノードの最深の共通祖先は、図6Cのデータ構造内の特定のボクセルと関連付けられてよい。
言い換えれば、ボクセル内のオブジェクト表面のプリミティブのすべてが単一のリーフノードのバウンディングボリューム内にある場合、そのリーフノードは、図6Cのボクセルに関連付けられた最深の共通祖先である。ボクセル内のオブジェクト表面のプリミティブが単一のリーフノードのバウンディングボリューム内に入らない場合、プリミティブを含む最深ノードの最深の共通祖先は、図6Cのボクセルに関連付けられたノードである。
図6Cのボクセルとノードとの間の関連付けを示すために、以下の例が提供される。はじめに、ボクセルV111は、ノードN8およびN10に関連付けられたバウンディングボリューム内にシーンオブジェクト表面のプリミティブを含む。ノードN8およびN10の最小の共通祖先はN2である。したがって、ボクセルV111に対するレイ交差テストに対する開始ノードはノードN2である。したがって、ボクセルV111は、図6Cに示すように、内部ノードN2に対応するラベルでラベル付けられてよく、または内部ノードN2に対応する色で色付けられてよい。
さらに、図6A〜図6Cの例では、ボクセルV112は、ノードN8およびN11に関連付けられたバウンディングボリューム内にシーンオブジェクト表面のプリミティブを含む。ノードN8およびN11の最小の共通祖先はN2(ボクセルV111と同じ最小の共通祖先)である。したがって、ボクセルV112に対するレイ交差テストに対する開始ノードはノードN2である。したがって、ボクセルV112は、図6Cに示すように、内部ノードN2に対応するラベルでラベル付けられてよく、または内部ノードN2に対応する色で色付けられてよい。
さらに、図6A〜図6Cの例では、ボクセルV211は、ノードN12およびN13に関連付けられたバウンディングボリューム内にシーンオブジェクト表面のプリミティブを含む。ノードN12およびN13の最小の共通祖先はノードN6である。したがって、ボクセルV211に対するレイ交差テストに対する開始ノードはノードN6である。したがって、ボクセルV211は、図6Cに示すように、内部ノードN6に対応するラベルでラベル付けられてよく、または内部ノードN6に対応する色で色付けられてよい。
さらに、図6A〜図6Cの例では、ボクセルV222は、ノードN9、N6およびN15に関連付けられたバウンディングボリューム内にシーンオブジェクト表面のプリミティブを含む。ノードN9、N6およびN15の最小の共通祖先はルートノードN1である。したがって、ボクセルV222に対するレイ交差テストに対する開始ノードはノードN1である。したがって、ボクセルV222は、図6Cに示すように、ルートノードN1に対応するラベルでラベル付けられてよく、またはルートノードN1に対応する色で色付けられてよい。
最後に、図6A〜図6Cの例では、ボクセルV212は、シーンオブジェクト表面のプリミティブを含まず、したがって、ボクセルV212は、図6Cに示すように、「ヌル」で、またはボクセルV212内にシーンオブジェクト表面のプリミティブがないことの他のインジケータでラベル付けられてよい。
いくつかの実装形態は、ボクセルを階層の一部分だけと関連付ける場合がある。たとえば、いくつかの態様では、ボクセルは、1、2、3、4、5、6、7、8、9、10またはそれ以上のレベルの深さに対する階層内のノードとのみと関連付けられてよい。一定の深さに対してのみボクセル化することによって、各ボクセルとノードのうちの少なくとも1つとの間の関連付けが、階層の最大ボクセル化レベルまたはより浅いレベルにおいて行われる。上記で説明した最低または最深の共通祖先が、階層のボクセル化レベルから選択されることになる。
図6A〜図6Cのデータ構造610、620および630は、各ボクセルをそのボクセルにマッピングされるノードに対応する「色」と関連付ける三次元テクスチャマップを生成するために使用されてよい。たとえば、ノードN1〜N15は、それぞれ色を割り当てられてよく、各ボクセルV111、V121、V211、V221、V112、V122、V212およびV222は、次いで、対応するノードによって色付けられてよい。追加の色が、プリミティブを包含しない(したがって、BVHツリー610内のノードにマッピングされない)ボクセルに割り当てられてよい。
ボクセルによって包含されるプリミティブが同様に、(BVHツリーの複数のノードに関連付けられた)複数のバウンディングボックスによって包含される場合、そのボクセルに関連付けられた色は、ボクセル内に同様に含まれるプリミティブを包含するバウンディングボリュームに関連付けられたすべてのノードのうちの最深の共通祖先に関連付けられた色に設定される。
第1の最深の共通祖先は、各ボクセルが単一の色値と関連付けられることを確認するためにボクセル化の間に判定される。また、第2の最深の共通祖先は、レイが通過するすべてのノードの最深の共通祖先を判定するためにレイをトレースするときに判定される。
レイ交差テストのためのノードを開始することは、図6Cのラベル付けられた(または色付けられた)ボクセルの「マップ」に基づく場合がある。図6Cに示すように事前計算されたマッピングに依存することは、複数のレイトレーシング演算が、各トレース演算によって各ボクセルに対する最低の共通祖先を再計算することなく実行されることを可能にし得る。
図3に関して上記で説明したように、レイ表面交差テストを実行するために、1次レイ、シャドーレイ、反射レイまたは他のタイプのレイのいずれにせよ、各レイは、最初に、それのオリジンの点から1つまたは複数のボクセルを通ってそれの行き先までトレースされる。レイが通過する各ボクセルは、図6Cに関して上記で説明したように、対応するテクスチャ色を有する。次いで、レイが通過するボクセルに対するテクスチャ色のセットが、図6Cに関して上記で説明したものと同様のデータ構造に基づいて決定されてよい。レイがn個のボクセルを通過する場合、m≦n個のテクスチャ色が識別されてよい。
ボクセルに対するテクスチャ色は、その特定のボクセルに対する最深の共通祖先を規定するので、少なくともいくつかの開示される態様では、レイに対するレイ交差テストに対する開始ノードは、テクスチャ色mに基づいてよい。たとえば、テクスチャ色に対応するノードの最深の共通祖先は、レイ交差テストのための開始ノードであってよい。
図7は、ボクセル化されたティーポットのシーンである。1シートのグラフ用紙上の複数の正方形が、接触はするが重複しない二次元領域を区切るように、三次元において、立方体ボリューム要素(ボクセル702のようなボクセル)は、接触はするが重複しないボリュームを区切る。ボクセルは、軸平行であってよい。二次元内で1枚のグラフ用紙上に描かれたオブジェクトが、1つまたは複数の正方形に交差する、および/またはそれらを完全に含有する場合があるように、三次元において、階層内のノードに関連付けられたバウンディングボリュームなどのオブジェクトは、1つまたは複数のボクセルに交差する、および/またはそれらを完全に含有する場合がある。したがって、ノードに関連付けられた各バウンディングボリュームは、単一のボクセルの一部、複数のボクセルの部分、および/または1つまたは複数のボクセル全体を占有する場合がある。したがって、各ボクセルは、バウンディングボリューム階層内の1つまたは複数のノードに関連付けられたバウンディングボリュームの空間を区切る(およびそのバウンディングボリュームと関連付けられる)場合がある。
したがって、一実施形態では、各ボクセル(たとえばボクセル702)は、三次元空間内で立方体領域を占有し、隣接ボクセルは連続している(接触している)が重複しない。ティーポットを含むシーンの基準軸は、ボクセルの三次元と整列されてよい。
シーンを区分するボクセルの一部分は、そのシーン内のオブジェクトによって同様に占有される三次元空間を表してよい。たとえば、シーン内のボクセルの一部分は、角錐または立方体の形状を形成してよい。三次元内の角錐は、二次元画像平面上の三角形に投影されてよい。グラフィックス処理において、小さい、通常は分割できないビルディングブロックが、シーン内のオブジェクトを表すためのプリミティブであってよい。各プリミティブは、三次元空間内のロケーションおよび方位の属性、ならびに色などの特性を有してよい。オブジェクトは、プリミティブの組合せとして表されてよい。したがって、シーンの三次元表現のソリッドモデルが、ボクセルを使用して形成されてよい。
次いで、各ボクセルは、各ボクセルに交差するかまたはそれを完全に含有する、階層内のバウンディングボリューム、およびそれらの関連するノードにマッピングされるか、あるいはそれらと関連付けられる。このマッピングは、個別のレイをトレースすることをサポートする。
レイが通過する各ボクセルが識別される。識別されたボクセルに関連付けられたノードの最低の共通祖先が識別され、階層ツリーを横断するための開始点として使用される。この開始点は、ハイアラークより低いので、ツリーのサブセットだけが横断される。これは、ハイアラークから横断を開始する実装形態と比較されるとき、レイ-プリミティブ交差テストの数を低減し、レイトレーシングの速度を上げる。
図8は、ボクセル化されたバウンディングボリュームを含むティーポットのシーン800を示す。また、図8は、2つのボクセル806および808を横断するレイ804を示す。各ボクセルは、三次元空間または軸平行な側面を有する立方体を包含してよい。隣接するボクセルは、重複せずに隣接してよい。シーンは三次元において表されているので、シーンは、たとえば、各ボクセルの側面がシーン寸法323、643、1283またはボクセルの何らかの他の数の16分の1を表すとき、163(16×16×16)ボクセルによって区分されてよい。三次元の各々に対するボクセルの数が等しいことは、必要とされない。たとえば、シーンは完全な立方体ではないが、別の寸法より長い少なくとも1つの寸法を有するとき、各寸法におけるボクセルの数は、変化する場合がある。空間の単位当たりのボクセルが増えるにつれて、シーンをより精細に分割することが可能になる。これは、ボクセルを処理する計算負荷を大きくするが、以下で説明するように最低の共通祖先を選択するとき、シーンを通過するレイ経路のより正確な定義を与える。
図9は、シーン800を表すために生成され得る階層データ構造900を示す。ルートノード915はシーン800の全ボリュームを表すので、全シーン800は、ルートノード915に対応する。ルートノード915は、ティーポットの注ぎ口および前部を含むシーンの右の部分を含む子ノード925と、ティーポットの取っ手、ふた、および後部を含むシーンの左の部分を表す子ノード935とを有する。ノード925は、同じくリーフノードであり、バウンディングボリューム840と関連付けられる子ノード945を有する。バウンディングボリューム840は、ティーポットの注ぎ口を含む。また、ノード925は、バウンディングボリューム850と関連付けられる子ノード955を有する。バウンディングボリューム850は、注ぎ口付近のティーポットの前部を含む三次元空間を包含する。領域820は、バウンディングボリューム840またはバウンディングボリューム850内だけに存在するのではなく、ノードCに関連付けられた図10内の領域に類似するノード925に関連付けられたバウンディングボリューム内にある、三次元空間内の点を含む。ノード935は、ティーポットのふたに対応するバウンディングボリューム870を有する子ノード975を有する。ノード935は、取っ手と、ティーポットの注ぎ口またはふたから離れたティーポットの部分とに対応するバウンディングボリューム860を有する子ノード965を有する。ノード965は、見えないバウンディングボリュームを有する2つのリーフノードに対応する2つの子ノード985および995を有する。領域830は、バウンディングボリューム860またはバウンディングボリューム870内だけに存在するのではない三次元空間内の点を含む。子ノード925または935のいずれかの中にだけ存在するのではないが、シーン800内に存在する三次元空間内の点は、810とラベル付けられ、ハイアラーク915に対応する。
図8は、バウンディングボリューム850によって包含されるボクセル806とバウンディングボリューム840によって完全に包含されるボクセル808とを示すが、いくつかの態様では、ボクセルは、ボリュームによって完全に包含されるとは限らないことに留意されたい。いくつかの態様では、1つまたは複数のボクセルは、1つまたは複数のバウンディングボリュームに及ぶ場合がある。
図8は、ボクセルとノードとの間のマッピングを示す。ボクセル806は、リーフノード955に関連付けられたボリューム850内にあるので、ボクセル806はノード955に位置する。同様に、ボクセル808は、リーフノード945に関連付けられたボリューム840内にあるので、ボクセル808はリーフノード945に位置する。2つ以上のバウンディングボリュームに及ぶボクセルは、そのボクセルが及ぶ、ボクセルの階層内の最低の共通祖先に位置する。たとえば、ボクセルが、ノード945に関連付けられたボリューム840とノード955に関連付けられたボリューム850とに及ぶ場合、そのボクセルは、ノード945およびノード955の最低の共通祖先にマッピングされ、そのボクセルは、ノード945およびノード955の最低の共通祖先、ノード925に位置する。この最低の共通祖先は、レイが特定のボクセルを通過することを判定する、以下で説明するレイトレーシング演算によって使用される場合がある。
階層900内の開始ノードを決定するために、開示される方法およびシステムは、レイ804が通過するボリュームを有するノードに対する共通祖先を決定する。レイ804はバウンディングボリューム840および850を通過するので、階層データ構造900を通るレイ804の任意のトレーシングは、少なくともこれらのボリュームを表すノードを含まなければならない。これは、それぞれ、ノード945および955に対応する。レイ804はバウンディングボリューム860を通過しないので、たとえば、バウンディングボリューム860を表すノード965を含む必要はない。
したがって、方法は、レイが通過するボリュームを表すノードのうちの最深の(最低の)共通祖先ノードである、横断のための開始ノードを決定する。図9の例では、ノード915はまた、ノード945および955に対する共通祖先であるが、ノード925は、ノード915より深い(階層内でより低いレベルにある)ので、開始(スタート)ノードである。したがって、方法は、開始ノード925において階層を横断することを開始し、レイ804をトレースするとき、開始ノード925から下方のノードに対して継続する。
レイ804に交差するオブジェクトがレイ交差テストを介して識別されると、シーン800のデジタル画像が、横断によって識別された交差に基づいて更新されてよい。次いで、更新されたデジタル画像は、電子ディスプレイ、コンピュータネットワーク、またはディスクもしくは他の安定したメモリのような安定したストレージなどの出力デバイスに出力されてよい。
図10は、BVHボクセル化のための例示的なアルゴリズム方法の図である。この例示的なボクセル化アルゴリズムは2段階からなる。第1の段階では、所定のツリー深さにおけるすべてのAABBがボクセル化される。第2の段階では、ボクセル化の複数のパスが続く。
図11は、最低の共通祖先を発見するための例示的なアルゴリズム方法である。この方法は、入力上の2つの1ベースの(インデックス1を有するルートノード)32ビット幅優先BVHノードインデックスを取って、それらの最低の共通祖先を返す。例示的なアルゴリズムは、最初に、両ノードが同じツリーレベル上になるまでノードをツリー内のより下方に移動させることによって働く。次いで、方法は、両ノードの経路が共通祖先内で会うまで両ノードから同時にツリーを上方に上る。
図12は、本開示の1つまたは複数の態様を実装するように構成され得る例示的なコンピューティングデバイスを示すブロック図である。図12に示すように、デバイス2は、限定はしないが、ビデオデバイス、メディアプレーヤ、セットトップボックス、携帯電話およびいわゆるスマートフォンなどのワイヤレスハンドセット、携帯情報端末(PDA)、デスクトップコンピュータ、ラップトップコンピュータ、ゲームコンソール、ビデオ会議ユニット、タブレットコンピューティングデバイスなどを含むコンピューティングデバイスであり得る。図12の例では、デバイス2は、中央処理ユニット(CPU)6、システムメモリ10、およびGPU12を含み得る。デバイス2は、ディスプレイプロセッサ14、トランシーバモジュール3、ユーザインターフェース4、およびディスプレイ8も含み得る。トランシーバモジュール3およびディスプレイプロセッサ14は、どちらもCPU6および/もしくはGPU12と同じ集積回路(IC)の一部である場合があるか、どちらもCPU6および/もしくはGPU12を含む1つもしくは複数のICの外部にある場合があるか、またはCPU6および/もしくはGPU12を含むICの外部にあるIC内に形成される場合がある。
デバイス2は、明快のために、図12に示さない追加のモジュールまたはユニットを含み得る。たとえば、デバイス2は、デバイス2がモバイルワイヤレス電話である例では電話通信をもたらし、デバイス2がメディアプレーヤである場合にはスピーカーをもたらすために、図12には示していない、スピーカーおよびマイクロフォンを含み得る。デバイス2は、ビデオカメラも含み得る。さらに、デバイス2に示す様々なモジュールおよびユニットは、デバイス2のすべての例には必要でない場合がある。たとえば、ユーザインターフェース4およびディスプレイ8は、デバイス2が、デスクトップコンピュータ、または外部のユーザインターフェースもしくはディスプレイとインターフェースするために装備された他のデバイスである例ではデバイス2の外部にある場合がある。
ユーザインターフェース4の例としては、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース4は、タッチスクリーンである場合もあり、ディスプレイ8の一部として組み込まれる場合がある。トランシーバモジュール3は、デバイス2と別のデバイスまたはネットワークとの間のワイヤレス通信または有線通信を可能にするための回路を含み得る。トランシーバモジュール3は、変調器、復調器、増幅器、および有線通信またはワイヤレス通信用の他のそのような回路を含み得る。
CPU6は、実行用のコンピュータプログラムの命令を処理するように構成された中央処理ユニット(CPU)などのマイクロプロセッサである場合がある。CPU6は、デバイス2の演算を制御する汎用プロセッサまたは専用プロセッサを含み得る。ユーザは、CPU6に1つまたは複数のソフトウェアアプリケーションを実行させるためにデバイス2に入力を提供し得る。CPU6上で実行するソフトウェアアプリケーションは、たとえば、オペレーティングシステム、ワードプロセッサアプリケーション、電子メールアプリケーション、スプレッドシートアプリケーション、メディアプレーヤアプリケーション、ビデオゲームアプリケーション、グラフィカルユーザインターフェースアプリケーション、または別のプログラムを含み得る。加えて、CPU6は、GPU12の演算を制御するためのGPUドライバ22を実行し得る。ユーザは、キーボード、マウス、マイクロフォン、タッチパッド、またはユーザインターフェース4を介してデバイス2に結合される別の入力デバイスなどの1つまたは複数の入力デバイス(図示せず)を介してデバイス2に入力を提供し得る。
CPU6上で実行されるソフトウェアアプリケーションは、ディスプレイ8へのグラフィックスデータのレンダリングを行わせるようCPU6に命令する1つまたは複数のグラフィックスレンダリング命令を含み得る。いくつかの例では、ソフトウェア命令は、たとえば、オープングラフィックスライブラリ(OpenGL(登録商標))API、オープングラフィックスライブラリ組込みシステム(OpenGL ES)API、Direct3D API、X3D API、RenderMan API、WebGL API、または任意の他の公的もしくはプロプライエタリ規格グラフィックスAPIなどのグラフィックスアプリケーションプログラミングインターフェース(API)に準拠し得る。グラフィックスレンダリング命令を処理するために、CPU6は、GPU12にグラフィックスデータのレンダリングの一部または全部を実行させるために、1つまたは複数のグラフィックスレンダリングコマンドをGPU12に(たとえば、GPUドライバ22を通じて)発行し得る。いくつかの例では、レンダリングされるべきグラフィックスデータは、グラフィックスプリミティブ、たとえば、点、線、三角形、四角形、三角形ストリップなどのリストを含んでもよい。
GPU12は、1つまたは複数のグラフィックスプリミティブをディスプレイ8にレンダリングするためのグラフィックス動作を実行するように構成され得る。したがって、CPU6上で実行されるソフトウェアアプリケーションのうちの1つがグラフィックス処理を必要とするとき、CPU6は、ディスプレイ8にレンダリングするためにグラフィックスコマンドおよびグラフィックスデータをGPU12に与え得る。グラフィックスデータは、たとえば、描画コマンド、状態情報、プリミティブ情報、テクスチャ情報などを含み得る。GPU12は、いくつかの事例では、CPU6よりも効率的な、複雑なグラフィック関連動作の処理を実現する高度並列構造で構築され得る。たとえば、GPU12は、複数の頂点またはピクセル上で並列に動作するように構成されたシェーダユニットなどの複数の処理要素を含み得る。GPU12の高度並列の性質は、いくつかの事例では、CPU6を使用してシーンを直接ディスプレイ8に描画するよりも速く、GPU12がグラフィックス画像(たとえば、GUIならびに2次元(2D)および/または3次元(3D)グラフィックスシーン)をディスプレイ8上で描画することを可能にし得る。
GPU12は、いくつかの事例では、デバイス2のマザーボードに統合され得る。他の事例では、GPU12は、デバイス2のマザーボード内のポート内にインストールされたグラフィックスカード上に存在する場合があるか、または場合によっては、デバイス2と相互動作するように構成された周辺デバイス内に組み込まれる場合がある。GPU12は、1つもしくは複数のマイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、デジタル信号プロセッサ(DSP)、または他の均等な集積論理回路もしくは個別論理回路などの1つまたは複数のプロセッサを含み得る。GPU12は、1つまたは複数のプロセッサコアを含む場合もあり、その結果、GPU12は、マルチコアプロセッサと呼ばれる場合がある。
GPU12は、グラフィックスメモリ40に直接結合され得る。したがって、GPU12は、バスを使用することなく、グラフィックスメモリ40に対してデータの読取りおよび書込みができる。言い換えれば、GPU12は、オフチップメモリの代わりにローカルストレージを使用して、データをローカルに処理することができる。そのようなグラフィックスメモリ40は、オンチップメモリと呼ばれる場合がある。このグラフィックスメモリ40は、GPU12が、重いバストラフィックを経る場合があるバスを介してGPU12がデータを読み書きする必要性を除去することによって、より効率的に動作することを可能にする。しかし、いくつかの事例では、GPU12は、別個のメモリを備えなくてもよく、その代わり、バスを介してシステムメモリ10を利用することができる。グラフィックスメモリ40は、1つまたは複数の揮発性または不揮発性メモリまたはストレージデバイス、たとえば、ランダムアクセスメモリ(RAM)、スタティックRAM(SRAM)、ダイナミックRAM(DRAM)、消去可能プログラム可能なROM(EPROM)、電気的に消去可能プログラム可能なROM(EEPROM)、フラッシュメモリ、磁気データ媒体、または光学ストレージ媒体など、を含むことができる。
いくつかの例では、GPU12は、システムメモリ10内に十分に形成された画像を記憶し得る。ディスプレイプロセッサ14は、画像を表示するためにディスプレイ8のピクセルを照明させる、システムメモリ10からの画像および出力値を取り出す場合がある。ディスプレイ8は、GPU12によって生成された画像コンテンツを表示するデバイス2のディスプレイである場合がある。ディスプレイ8は、液晶ディスプレイ(LCD)、有機発光ダイオードディスプレイ(OLED)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、または別のタイプのディスプレイデバイスである場合がある。
本開示の態様によれば、GPU12は、階層データ構造体内に複数のプリミティブを編成し得る。GPU12は、階層データ構造体のノードに関連付けられた1つまたは複数のバウンディングボリュームをオフスクリーンレンダリングターゲットにラスタライズまたはボクセル化し得る。GPU12は、階層データ構造体の横断を開始するための階層データ構造体内の開始ノードとして階層データ構造体の内部非ルートノードを決定し得る。GPU12は、レイが交差するプリミティブを決定するために開始ノードから開始して階層データ構造体を横断し得る。
図13は、図12のCPU6、GPU12、およびシステムメモリ10の例示的な実装形態をさらに詳細に示すブロック図である。図13に示すように、CPU6は、各々がCPU6上で実行する1つまたは複数のソフトウェアアプリケーションまたはサービスである場合がある、少なくとも1つのソフトウェアアプリケーション18、グラフィックスAPI20、およびGPUドライバ22を含み得る。
CPU6およびGPU12が利用可能なメモリは、システムメモリ10およびフレームバッファ16を含み得る。フレームバッファ16は、システムメモリ10の一部である場合があるか、またはシステムメモリ10とは別である場合がある。フレームバッファ16は、レンダリングされた画像データを記憶し得る。
ソフトウェアアプリケーション18は、GPU12の機能を利用する任意のアプリケーションであり得る。たとえば、ソフトウェアアプリケーション18は、GUIアプリケーション、オペレーティングシステム、ポータブルマッピングアプリケーション、工学用アプリケーションもしくは芸術用アプリケーションのためのコンピュータ支援設計プログラム、ビデオゲームアプリケーション、または2Dグラフィックスもしくは3Dグラフィックスを使用する別のタイプのソフトウェアアプリケーションである場合がある。
ソフトウェアアプリケーション18は、グラフィカルユーザインターフェース(GUI)および/またはグラフィックスシーンをレンダリングするようにGPU12に命令する1つまたは複数の描画命令を含み得る。たとえば、描画命令は、GPU12によってレンダリングされるべき1つまたは複数のグラフィックスプリミティブのセットを定義する命令を含み得る。いくつかの例では、描画命令は、GUIで使用される複数のウィンドウ処理サーフェスの全部または一部をまとめて定義してもよい。追加の例では、描画命令は、アプリケーションによって定義されたモデル空間またはワールド空間内に1つまたは複数のグラフィックスオブジェクトを含むグラフィックスシーンの全部または一部をまとめて定義してもよい。
ソフトウェアアプリケーション18は、1つまたは複数のグラフィックスプリミティブを表示可能グラフィックス画像にレンダリングするために、グラフィックスAPI20を介して1つまたは複数のコマンドをGPU12に発出するようにGPUドライバ22を起動し得る。たとえば、ソフトウェアアプリケーション18は、グラフィックスAPI20を介して、プリミティブ定義をGPU12に提供するようにGPUドライバ22を起動し得る。ある事例では、プリミティブ定義は、描画プリミティブ、たとえば、三角形、長方形、三角形ファン、三角形ストリップなどのリストの形でGPU12に与えられ得る。プリミティブ定義は、レンダリングされるべきプリミティブに関連付けられた1つまたは複数の頂点を指定する頂点仕様を含み得る。頂点仕様は、頂点ごとの位置座標と、ある事例では、たとえば、色座標、法線ベクトル、およびテクスチャ座標など、頂点に関連付けられた他の属性とを含み得る。プリミティブ定義はまた、プリミティブタイプ情報(たとえば、三角形、長方形、三角形ファン、三角形ストリップなど)、スケーリング情報、回転情報などを含み得る。ソフトウェアアプリケーション18によってGPUドライバ22に発出された命令に基づいて、GPUドライバ22は、プリミティブをレンダリングするためにGPU12が実行する1つまたは複数の演算を指定する1つまたは複数のコマンドを策定し得る。GPU12がCPU6からコマンドを受け取るとき、グラフィックス処理パイプライン24は、コマンドを復号し、コマンドに指定された演算を実行するようにグラフィックス処理パイプライン24を構成する。たとえば、グラフィックス処理パイプライン24内の入力アセンブラ(図示せず)は、プリミティブデータを読み取り、データをアセンブルし、グラフィックス処理パイプライン24の他のグラフィックスパイプラインステージが使用するためのプリミティブにする場合がある。グラフィックス処理パイプライン24は、指定された演算を実行した後、レンダリングされたデータをディスプレイデバイスに関連付けられたフレームバッファ16に出力する。
フレームバッファ16は、GPU12のための宛先ピクセルを記憶する。各宛先ピクセルは、一意のスクリーンピクセルロケーションに関連付けられ得る。いくつかの例では、フレームバッファ16は、各宛先ピクセルに関する色成分および宛先アルファ値を記憶し得る。たとえば、フレームバッファ16は、各ピクセルの赤、緑、青、アルファ(RGBA)成分を記憶し得るが、ここにおいて、「RGB」成分は色値に相当し、「A」成分は宛先アルファ値に相当する。フレームバッファ16およびシステムメモリ10は別のメモリユニットであるものとして示されているが、他の例では、フレームバッファ16は、システムメモリ10の一部である場合がある。
いくつかの例では、グラフィックス処理パイプライン24は、頂点シェーダステージ、ハルシェーダステージ、ドメインシェーダステージ、ジオメトリシェーダステージ、ピクセルシェーダステージ、およびコンピュートシェーダステージのうちの1つまたは複数を含み得る。グラフィックス処理パイプライン24のこれらのステージは、シェーダステージと見なされ得る。これらのシェーダステージは、GPU12内のシェーダユニット46上で実行する1つまたは複数のシェーダプログラムとして実装され得る。シェーダユニット46は、処理構成要素のプログラマブルパイプラインとして構成され得る。いくつかの例では、シェーダユニット46は、「シェーダプロセッサ」または「統合シェーダ」と呼ばれる場合があり、ジオメトリシェーディング演算、頂点シェーディング演算、ピクセルシェーディング演算、またはグラフィックスをレンダリングするための他のシェーディング演算を実行する場合がある。シェーダユニット46は、プロセッサコア48を含む場合があり、プロセッサコア48の各々は、演算をフェッチおよび復号するための1つまたは複数の構成要素、算術計算を実行するための1つまたは複数の算術論理ユニット、1つまたは複数のメモリ、キャッシュ、およびレジスタを含む場合がある。
GPU12は、グラフィックス処理パイプライン24内の頂点シェーダステージ、ハルシェーダステージ、ドメインシェーダステージ、ジオメトリシェーダステージ、およびピクセルシェーダステージのうちの1つまたは複数を実行するコマンドをシェーダユニット46に送ることによって、頂点シェーディング、ハルシェーディング、ドメインシェーディング、ジオメトリシェーディング、ピクセルシェーディング、コンピュートシェーディングなどの様々なシェーディング演算を実行するようにシェーダユニット46を指定し得る。いくつかの例では、GPUドライバ22は、1つまたは複数のシェーダプログラムをコンパイルし、コンパイルされたシェーダプログラムをGPU12内に含まれる1つまたは複数のプログラマブルシェーダユニット上にダウンロードするように構成され得る。シェーダプログラムは、たとえば、OpenGL Shading Language(GLSL)、High Level Shading Language(HLSL)、またはC for Graphics(Cg) shading languageなど、高レベルシェーディング言語で書かれる場合がある。コンパイルされたシェーダプログラムは、GPU12内のシェーダユニット46の演算を制御する1つまたは複数の命令を含み得る。たとえば、シェーダプログラムは、頂点シェーダステージの関数を実行するためにシェーダユニット46によって実行され得る頂点シェーダプログラム、ハルシェーダステージの関数を実行するためにシェーダユニット46によって実行され得るハルシェーダプログラム、ドメインシェーダステージの関数を実行するためにシェーダユニット46によって実行され得るドメインシェーダプログラム、ジオメトリシェーダステージの関数を実行するためにシェーダユニット46によって実行され得るジオメトリシェーダプログラム、および/またはピクセルシェーダの関数を実行するためにシェーダユニット46によって実行され得るピクセルシェーダプログラム、ならびに/あるいはコンピュートシェーダの関数を実行するためのシェーダユニット46によって実行され得るコンピュートシェーダプログラムを含み得る。頂点シェーダプログラムは、プログラマブル頂点シェーダユニットまたは統合シェーダユニットの実行を制御し、1つまたは複数の頂点ごとの動作を指定する命令を含み得る。
グラフィックスメモリ40は、GPU12の集積回路に物理的に統合されたオンチップストレージまたはメモリである。グラフィックスメモリ40がオンチップであるので、GPU12は、システムバスを介してシステムメモリ10から値を読み取り、またはシステムメモリ10に値を書き込むよりも迅速にグラフィックスメモリ40から値を読み取り、またはグラフィックスメモリ40に値を書き込むことができる場合がある。グラフィックスメモリ40は、シーンプリミティブ(たとえば、三角形)を階層的にグループ化するADS41を記憶する場合がある。いくつかの例では、ADS41は、システムメモリ10内、シェーダユニット46のシェーダメモリ(図示せず)内、または共有システム/グラフィックスメモリ(図示せず)内に記憶され得る。
本開示の態様によれば、GPU12は、ADS41内に複数のプリミティブを編成し得る。GPU12は、ADS41のノードに関連付けられた1つまたは複数のバウンディングボリュームを、グラフィックスメモリ40に記憶されたオフスクリーンレンダーターゲットにラスタライズまたはボクセル化し得る。GPU12は、ADS41の横断を開始するためのADS41内の開始ノードとしてADS41の非ルートノードを決定し得る。GPU12は、レイが交差するプリミティブを決定するために開始ノードから開始してADS41を横断し得る。
図14は、レイ-オブジェクト交差を判定するための例示的な方法1400を示すフローチャートである。いくつかの態様では、方法1400は、図12のデバイス2によって実行され得る。たとえば、いくつかの態様では、方法1400は、CPU6、GPU12およびディスプレイプロセッサ14のうちの1つまたは複数によって実行され得る。いくつかの態様では、方法1400は、以下で説明する機能を実行するために、CPU6、GPU12およびディスプレイプロセッサ14のうちの1つまたは複数を構成する命令によって実行され得る。方法1400は一連のブロックとして以下で説明されるが、以下で説明するブロックのいずれかは、オプションであってもよい。特に、ブロック1460および/または1470は、いくつかの態様では実行されないことがある。
ブロック1410では、方法1400は、シーンを複数のボクセルに区分する。たとえば、いくつかの態様では、シーンは、図6A〜図6Cの例に関して上記で説明したように区分される場合がある。シーンは、多様な方法を使用して区分されてよい。たとえば、シーンは、三次元空間の2、4、6、8、10または任意の数の等しいサイズの部分にシーンを分割することによって区分されてよい。シーンを包含する三次元空間がx、yおよびzの次元を有する場合、各次元は、ボクセルの各次元の長さを決定するために定数によって割られてよい。次いで、各ボクセルは、シーンに対する全空間が重複しないボクセルによって包含されるまで、決定された次元の隣接するボクセルによって定義され得る。これは、シーンを区分する唯一の方法ではなく、例示的な一例として提供される。一実施形態では、ブロック1410の機能は、図13のGPU12によって実行される場合がある。
ブロック1420は、ボクセルの少なくとも一部分をバウンディングボリューム階層(BVH)内の対応するノードと関連付け、BVHは、シーン内の1つまたは複数のオブジェクトプリミティブを表す。いくつかの態様では、ブロック1420内で実行されるボクセル化は、図10に関して上記で説明したボクセル化に実質的に従って実行される場合がある。
いくつかの実装形態は、ボクセル内に位置する表面プリミティブの少なくとも一部分(またはいくつかの態様では、すべて)を包含するバウンディングボリュームに関連付けられた階層内のノードのセットを決定することによって、およびボクセルをノードのセットの最深の共通祖先と関連付けることによって、各ボクセルを対応するノードと関連付ける。一実施形態では、ブロック1410の機能は、図13のGPU12によって実行される場合がある。いくつかの態様では、ブロック1420内で実行される関連付けは、図6A〜図6Cに関して上記で説明したとおりである。
いくつかの態様では、階層の探索性能を改善し、ボクセルに基づくノードの識別情報に関連付けられたオーバーヘッドを低減するために、1つまたは複数のボクセル、バウンディングボリュームおよび階層内のノードの間の関連付けを記憶する、インデックス付けるデータ構造が生成される場合がある。データ構造は、各ボクセルに対する最深の共通祖先ノードを記録してよい。データ構造を介してルックアップ演算を実行することによって、ボクセルに関連付けられた最深の共通祖先ノードが効率的に識別され得る。一実施形態では、ブロック1420の機能は、図13のGPU12によって実行される場合がある。
方法1400のいくつかの態様では、上記で説明したブロック1410および/または1420は、実行されない場合がある。たとえば、いくつかの態様では、BVHツリーは、デジタル画像を処理する第1の部分の間にボクセル化される場合がある。デジタル画像の処理の間、1次レイ、シャドーレイ、反射レイ、屈折レイ、および/または他のタイプのレイに対する数百または数千のレイトレーシング演算が実行される場合がある。同じ加速データ構造(すなわち、同じBVHツリーおよび/またはボクセル化)が、複数のこれらのレイトレーシング演算によって処理するために依存される場合がある。したがって、第1のレイトレーシング演算は、ブロック1410および1420を含んでよいが、第2のレイトレーシング演算は、同じデータ構造を顧慮してよく、したがってブロック1410および1420を実行しない。
ブロック1430では、方法1400は、レイが通過するボクセルのセットを決定する。いくつかの態様では、ボクセルのセットは、シーンの三次元空間内のレイの経路と、ボクセルのセット内の各ボクセルによって包含される空間とを比較することによって決定され得る。レイの経路が特定のボクセルによって包含される空間と重複する場合、レイはボクセルを通過する。そうでなければ、レイはボクセルを通過しない。
たとえば、図8のレイ804は、2つのボクセル806および808を通過する。レイ804は、バウンディングボリューム850内のボクセル806とバウンディングボリューム840内のボクセル808とを通過する。レイは開始ロケーションおよび方向によって特徴付けられ得るので、レイの経路を決定することは、レイの光学の簡単な適用である。レイの経路が知られると、いくつかの態様では、レイ経路を含む三次元空間を表すボクセルは、ボクセルのセット内に含まれるように決定されてよい。一実施形態では、ブロック1430の機能は、図13のGPU12によって実行される場合がある。
ブロック1435では、ボクセルのセット(レイが通過する)に関連付けられたノードのセットが決定される。この決定は、ブロック1420内で行われる関連付けに基づく場合がある。いくつかの態様では、ノードのセットを決定するステップは、ボクセルのセット内の各ボクセルとボクセルが関連付けられたノードとの間の関連付けを記憶するデータ構造を参照するステップを含む場合がある。ノードのセット内の各ノードは、対応するボクセルの識別子に基づいてデータ構造から読み取られ得る。いくつかの態様では、ブロック1435に関して上記で説明した関数のうちの1つまたは複数が、図13のGPU12によって実行される場合がある。
ブロック1440は、ブロック1435内で決定されたノードのセットの最深の共通祖先を決定する。いくつかの態様では、ノードのセットの最深の共通祖先は、ノードのセット内のノードのうちの任意の1つを選択することによって発見される場合がある。ノードを選択した後、選択されたノードがノードのセット内のすべての他のノードに対する祖先であるかどうかを判定するために、テストが実行されてよい。選択されたノードが祖先でない場合、選択されたノードの直接の祖先は、選択された新しいノードになる場合がある。次いで、選択された新しいノードがノードのセット内のすべてのノードに対する祖先であるかどうかを判定するために、検査が実行されてよい。祖先でない場合、選択された新しいノードの祖先は、さらに選択された第2の新しいノードになる場合がある。このプロセスは、すべてのノードの祖先が決定されるまで繰り返されてよい。いくつかの態様では、このプロセスの最適化は、最初に、BVHツリー内の最も浅いノードであるノードのセット内の1つのノードを識別するステップを含む場合がある。この識別されたノードは、最初に、そのノードがノードのセット内のすべての他のノードの祖先であるかどうかを判定するために選択されてよい。
最深の共通祖先の例については、図8を参照して説明する。レイ804は、2つのボクセルを通過する。最初に、レイは、(図9の)ノード955のバウンディングボリューム850内のボクセル806を通過する。また、レイ804は、ノード945のバウンディングボリューム840内のボクセル808を通過する。したがって、図8〜図9の例では、ノードのセットはノード945および955である。ブロック1420に関して上記で説明したように、いくつかの態様では、インデックス付けるデータ構造が、各ボクセルに関連付けられた第1の開始ノードの効率的な識別を可能にするために提供されてよい。ブロック1435内で決定されたノードのセットが空のセットである場合、レイは、シーン内のどのオブジェクトとも交差しなかった。一実施形態では、ブロック1440の機能は、図13のGPU12によって実行される場合がある。
ブロック1450では、方法1400は、レイとオブジェクトとの間の交点を決定するために最深の共通祖先において開始して階層を横断する。階層を横断するステップは、レイ-プリミティブ交差テストを行うためにボリュームによって包含されるプリミティブに対する横断されたノードに関連付けられたボリュームを探索するステップに対応する。各レイ交差テストは、レイの経路が、ボリュームによって包含されるプリミティブによって少なくとも部分的に表されるオブジェクトに交差するかどうかを判定する。ルートノードの下の階層の横断を開始することによって、低減された数のノードおよびそれゆえバウンディングボリュームが探索される。したがって、レイのトレースを完了するために、より少ないオブジェクト-プリミティブテストが必要になる。いくつかの態様では、開始ノードが識別されると、方法1400は、深さ優先横断を使用して開始ノードから下方の階層の部分を横断する。一実施形態では、ブロック1450の機能は、図13のGPU12によって実行される場合がある。
ブロック1460では、いくつかの態様が、ブロック1450の横断の間に識別されるレイ/オブジェクト交差に基づいてシーンのデジタル画像を更新する場合がある。たとえば、オブジェクトに対する照明/輝度値は、レイがオブジェクトに交差するか否かに基づいて変動する場合がある。たとえば、レイが2次レイである場合、およびレイが光源に到達する前にプリミティブに交差する場合、2次レイが発生するプリミティブの輝度値は、2次レイが光源に到達する前にプリミティブに交差しない場合よりも暗くなる場合がある。一実施形態では、ブロック1460の機能は、図13のGPU12によって実行される場合がある。
オプションブロック1470では、更新されたデジタル画像または更新されたデジタル画像から導出されたデータが、次いで、電子ディスプレイなどの出力デバイス、インターネットなどの電子ネットワーク、またはディスクドライブなどの安定なストレージデバイスに出力されてよい。たとえば、いくつかの態様では、ブロック1470は、部分を表すデータを取得するために更新されたデジタル画像の少なくとも一部分を含むファイルまたは他のメモリオブジェクトを読み取ることによって、およびたとえばデバイスドライバまたはストリームAPIを介して出力デバイスにデータを書き込むことによって実行される場合がある。この読取り/書込みサイクルは、更新されたデジタル画像を含むすべてのデータが出力されるまで、必要に応じて繰り返されてよい。たとえば、書き込むステップは、ファイルマーカの最後が到達したときに終了してもよい。一実施形態では、ブロック1470の機能は、図13のGPU12によって実行される場合がある。レイ-プリミティブ交差が発見された後、探索の結果は、プリミティブのIDを含む。次いで、IDは、プリミティブ属性(法線、位置などの頂点属性)を取り出すために使用される。また、探索の結果は、通常、重心座標で表されるレイとプリミティブとの正確な交点を含む。次いで、これらは頂点属性を内挿するために使用され、次いで、これらは(たとえば)ライティングを計算するために使用される。
また、いくつかの実装形態は、階層を生成するステップを含む場合がある。階層を生成するステップは、シーン内に含まれる三次元オブジェクトを表すために、三角形などのプリミティブのメッシュを生成するステップを含む場合がある。いくつかの態様では、階層を生成するステップは、複数のリーフノードを生成するステップを含む。各リーフノードは、少なくとも1つのプリミティブに境界をつける、対応するバウンディングボリュームを表す場合がある。また、階層を生成するステップは、複数の内部ノードを生成するステップを含む場合がある。各内部ノードは、階層内の少なくとも1つの他のノードに対する直接の祖先である場合がある。各内部ノードは、内部ノードから下方の各ノードによって表されるボリュームを含むバウンディングボリュームを表す場合がある。ハイアラークは、もちろんハイアラーク自体を除く、階層のすべてのノードに対する祖先である。ハイアラークはすべての他のノードに対する祖先であるので、ハイアラークはまた、階層のすべての他のノードによって表されるバウンディングボリュームを含む、第1のボリュームを表す。いくつかの態様では、各内部ノードは、2つまでのノードに対する直接の祖先である。いくつかの態様では、各バウンディングボリュームは、第1のボリューム内の三次元の軸平行なバウンディングボックスを表す。
いくつかの態様では、階層を生成するステップはまた、各ノードを階層の深さレベルに割り当てるステップを含む場合がある。ハイアラークは最も浅い深さレベルであってよく、一方、少なくとも1つのリーフノードは階層の最深の深さレベルを規定する。いくつかの態様では、階層は、図12および図13に関して上記で説明したように生成される場合がある。
図15は、ティーポットシャドー、頭の反射、フルーツボールのアンビエントオクルージョン(AO)、コンピュータゲームSponzaのアンビエントオクルージョンからのシーン、および球体反射を含むシャドーレイに対するボクセル化結果を示す。図15の各画像はレンダリングされたシーンである。
図16は、ベースライン(開示される技術を使用することなく、ルートノードから開始する)におけるシーンと、深さ1、2、6、10および15のバウンディングボリューム階層を使用するシーンとの各々に対する結果を含む、図15に示すシーンに対するシャドーレイに対するBVHボクセル化の結果を列挙する。
例示的な結果は、Intel Core i5-2540M CPUと、GPU上で動作するレイトレーサを使用するNVIDIA GeForce 4200M GPUとを実行する市販のラップトップコンピュータ上で測定された。レイトレーサは、DirectX 11 APIの上部に構築される。レイトレーサは、BVHラスタライゼーションに対する頂点およびピクセルシェーダとBVH横断に対するコンピュートシェーダとを使用する。例示的なボクセル化コードは、ラップトップコンピュータのCPU上で作動する。
数163および323は、ボクセルグリッドの解像度に対応する。たとえば、163は、16×16×16=4096ボクセルを含むボクセルグリッドに対応する。同様に、323は、32×32×32=32,768ボクセルを含むボクセルグリッドに対応する。たとえば、163のボクセルを有し、10の深さにおけるフルーツボールのシーンでは、レイ/AABB交差テストの数は、11.2%低減されて、353,000,000となる。323のボクセルを有し、10の深さにおける同じフルーツボールのシーンでは、レイ/AABB交差テストの数は、19.1%低減されて、321,000,000となる。この改善された低減は、BVHボクセル化のためにかかる時間を犠牲にして生じる。10の深さにおいて、BVHボクセル化時間は、ボクセル数が163から323に増加するのにつれて2.69msから6.20msに増加する。Table 2(表2)は、深さの増加ならびにボクセル解像度の増加は、レイ/AABB交差テストの数のさらなる低減をもたらし得ることを示す。これらの改善は、増加するボクセル化時間を犠牲にして生じる場合がある。最適なボクセル解像度および深さは、異なるシーンとともに変化する場合がある。
本明細書において「第1の」、「第2の」などの呼称を用いる要素へのいかなる参照も、一般的には、それらの要素の量または順序を限定するものではないことを理解されたい。むしろ、これらの指示は、本明細書では、2つ以上の要素または要素の例同士を区別する好都合な方法として使用されることがある。したがって、第1の要素および第2の要素の参照は、そこで2つの要素しか利用できないこと、または何らかの形で第1の要素が第2の要素に先行しなければならないことを意味しない。
また、特に明記しない限り、要素のセットは、1つまたは複数の要素を含んでもよい。加えて、説明または特許請求の範囲で使用される「A、B、またはCのうちの少なくとも1つ」という形態の用語は、「AまたはBまたはC、あるいはこれらの要素の任意の組合せ」を意味する。一例として、「a、b、またはcのうちの少なくとも1つ」は、a、b、c、a-b、a-c、b-c、およびa-b-cを包含することを意図されている。
本明細書で使用される「判定する(determining)」という用語は、多種多様なアクションを包含する。たとえば、「判定する」ことは、計算すること、算出すること、処理すること、導出すること、調査すること、ルックアップすること(たとえば、テーブル、データベースまたは別のデータ構造内でルックアップすること)、確認することなどを含んでもよい。また、「判定する」ことは、受信すること(たとえば、情報を受信すること)、アクセスすること(たとえば、メモリ内のデータにアクセスすること)などを含み得る。また、「判定する」ことは、解決すること、選択すること、選ぶこと、確立することなどを含み得る。
上記で説明された方法の様々な動作は、様々なハードウェアおよび/またはソフトウェア構成要素、回路、および/またはモジュールなど、動作を実施することが可能な任意の好適な手段によって実施され得る。概して、図に示された任意の動作は、その動作を実施することが可能な対応する機能的手段によって実施され得る。
本開示に関連して説明する様々な例示的な論理ブロック、モジュールおよび回路は、汎用プロセッサ、グラフィックスプロセッサユニット(GPU)、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ信号(FPGA)もしくは他のプログラマブル論理デバイス(PLD)、個別ゲートもしくはトランジスタ論理、個別ハードウェア構成要素、または本明細書で説明する機能を実行するように設計されたそれらの任意の組合せを用いて実装または実行され得る。
本明細書で説明するシステムおよび方法は、多種多様なコンピューティングデバイス上に実装され得る。これらは、汎用コンピューティングシステムまたは専用コンピューティングシステムの環境または構成を使用し得る。本発明とともに使用するのに適し得る、コンピューティングシステム、環境、および/または構成の例には、パーソナルコンピュータ、サーバコンピュータ、ハンドヘルドデバイスまたはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能な家庭用電化製品、ネットワークPC、ミニコンピュータ、メインフレームコンピュータ、上記のシステムまたはデバイスのいずれかを含む分散コンピューティング環境、などが含まれるが、それらに限定されない。
汎用プロセッサは、マイクロプロセッサであってもよいが、代替として、プロセッサは、任意の市販のプロセッサ、コントローラ、マイクロコントローラ、またはステートマシンであってもよい。また、プロセッサは、計算デバイスの組合せ、たとえば、DSPとマイクロプロセッサの組合せ、複数のマイクロプロセッサ、DSPコアと関連した1つまたは複数のマイクロプロセッサ、または任意の他のそのような構成として実現されてもよい。
1つまたは複数の態様では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装される場合、機能は、1つまたは複数の命令またはコードとして、コンピュータ可読媒体上に記憶されるか、またはコンピュータ可読媒体を介して送信され得る。コンピュータ可読媒体は、コンピュータ記憶媒体と、コンピュータプログラムのある場所から別の場所への転送を容易にする任意の媒体を含む通信媒体の両方を含む。記憶媒体は、コンピュータによってアクセスされ得る任意の使用可能な媒体であってもよい。
限定ではなく例として、そのようなコンピュータ可読媒体は、RAM、ROM、EEPROM、CD-ROMまたは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気ストレージデバイス、あるいは命令またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用され得、コンピュータによってアクセスされ得る任意の他の媒体を含むことができる。本明細書で使用されるディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピーディスク(disk)、およびBlu-ray(登録商標)ディスク(disc)を含み、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、データをレーザーで光学的に再生する。
本明細書で開示される方法は、説明した方法を実現するための1つまたは複数のステップまたはアクションを含む。方法ステップおよび/または方法アクションは、特許請求の範囲から逸脱することなく互いに入れ替えてもよい。言い換えれば、ステップまたはアクションの特定の順序が指定されない限り、特定のステップおよび/またはアクションの順序および/または使用は、特許請求の範囲から逸脱することなく変更されてもよい。説明した機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せにおいて実装されてよい。ソフトウェアで実装される場合、機能は、1つまたは複数の命令としてコンピュータ可読媒体上に記憶され得る。
したがって、いくつかの態様は、本明細書で提示した動作を実行するためのコンピュータプログラム製品を備え得る。たとえば、そのようなコンピュータプログラム製品は、命令が記憶(および/または符号化)されているコンピュータ可読媒体を備えてよく、命令は、本明細書で説明する動作を実行するために1つまたは複数のプロセッサによって実行可能である。いくつかの態様に対して、コンピュータプログラム製品はパッケージング材料を含み得る。
特許請求の範囲が、上で示された厳密な構成および構成要素に限定されないことを理解されたい。上で説明した方法および装置の配置、動作および細部において、特許請求の範囲から逸脱することなく、様々な変更、改変および変形が加えられてもよい。