JP2022510804A - 倍精度を用いない隙間のないレイと三角形との交差 - Google Patents
倍精度を用いない隙間のないレイと三角形との交差 Download PDFInfo
- Publication number
- JP2022510804A JP2022510804A JP2021527088A JP2021527088A JP2022510804A JP 2022510804 A JP2022510804 A JP 2022510804A JP 2021527088 A JP2021527088 A JP 2021527088A JP 2021527088 A JP2021527088 A JP 2021527088A JP 2022510804 A JP2022510804 A JP 2022510804A
- Authority
- JP
- Japan
- Prior art keywords
- ray
- center
- gravity
- rounding mode
- triangle
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/38—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
- G06F7/48—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
- G06F7/499—Denomination or exception handling, e.g. rounding or overflow
- G06F7/49942—Significance control
- G06F7/49947—Rounding
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/06—Ray-tracing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/38—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
- G06F7/48—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
- G06F7/483—Computations with numbers represented by a non-linear combination of denominational numbers, e.g. rational numbers, logarithmic number system or floating-point numbers
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/50—Lighting effects
- G06T15/80—Shading
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Computer Graphics (AREA)
- General Engineering & Computer Science (AREA)
- Nonlinear Science (AREA)
- Image Generation (AREA)
Abstract
本明細書では、隙間のない結果を生成する方法でレイ・三角形交差テストを実行する技術について説明する。この技術は、原点がレイの原点になるように三角形の座標を変換することを含む。この技術は、座標系をレイのビュースペースに投影することを含む。この技術は、重心座標を計算し、重心座標を補間して交差時間を取得することを含む。重心座標の符号は、ヒットが発生したかどうかを示す。上記の計算は、隙間のなさを提供するために無向浮動小数点丸めモードで実行される。無向丸めモードは、丸められる数値の仮数が、その数値の符号に依存しない方法で丸められるモードである。【選択図】図3
Description
(関連出願の相互参照)
本願は、2018年12月13日に出願された米国特許出願第16/219,820号の利益を主張するものであり、その内容は、言及することによって本明細書に組み込まれる。
本願は、2018年12月13日に出願された米国特許出願第16/219,820号の利益を主張するものであり、その内容は、言及することによって本明細書に組み込まれる。
レイトレーシング(ray tracing)は、シミュレートされたレイ(光線)をキャストしてオブジェクトの交差をテストし、レイキャストの結果に基づいてピクセルを着色する、グラフィックスレンダリング技術の一種である。レイトレーシングは、ラスタライズベースの技術よりも計算コストが高くなるが、物理的により正確な結果が得られる。レイトレーシング演算における改良が絶えず行われている。
添付図面に関連して例として示される以下の説明から、より詳細な理解を得ることができる。
本明細書では、隙間のない(watertight)結果を生成する方法でレイ・三角形交差テスト(ray-triangle intersection test)を実行する技術について説明する。この技術は、三角形の座標を、原点がレイの原点になるように変換することを含む。この技術は、座標系をレイのビュースペースに投影することを含む。この技術は、重心座標を計算し、重心座標を補間して交差時間を取得することを含む。重心座標の符号は、ヒットが発生したかどうかを示す。上記の計算は、隙間のなさを提供するために、無向浮動小数点丸めモード(non-directed floating point rounding mode)で実行される。無向丸めモード(non-directed rounding mode)とは、丸められた数値の仮数が、その数値の符号に依存しない方法で丸められるモードである。
図1は、本開示の1つ以上の特徴を実装することができる例示的なデバイス100のブロック図である。デバイス100は、例えば、コンピュータ、ゲーミングデバイス、ハンドヘルドデバイス、セットトップボックス、テレビ、携帯電話、又は、タブレットコンピュータを含む。デバイス100は、プロセッサ102と、メモリ104と、記憶装置106と、1つ以上の入力デバイス108と、1つ以上の出力デバイス110と、を含む。デバイス100は、オプションとして、入力ドライバ112及び出力ドライバ114も含む。デバイス100は、図1に示されていない追加のコンポーネントを含むことが理解されよう。
様々な代替例では、プロセッサ102は、中央処理装置(CPU)、グラフィックス処理装置(GPU)、同じダイ上に配置されたCPU及びGPU、又は、1つ以上のプロセッサコアを含み、各プロセッサコアは、CPU又はGPUであってもよい。様々な代替例では、メモリ104は、プロセッサ102と同じダイ上に配置されてもよいし、プロセッサ102とは別々に配置されてもよい。メモリ104は、揮発性メモリ又は不揮発性メモリ(例えば、ランダムアクセスメモリ(RAM)、ダイナミックRAM、キャッシュ等)を含む。
記憶装置106は、固定又は着脱可能な記憶装置(例えば、ハードディスクドライブ、ソリッドステートドライブ、光学ディスク、又は、フラッシュドライブ)を含む。入力デバイス108は、限定されないが、キーボード、キーパッド、タッチスクリーン、タッチパッド、検出器、マイクロフォン、加速度計、ジャイロスコープ、生体スキャナ、又は、ネットワーク接続(例えば、無線IEEE802信号の送信及び/若しくは受信のための無線ローカルエリアネットワークカード)を含む。出力デバイス110は、限定されないが、ディスプレイデバイス118、スピーカ、プリンタ、触覚フィードバックデバイス、1つ以上の照明、アンテナ、又は、ネットワーク接続(例えば、無線IEEE802信号の送信及び/若しくは受信のための無線ローカルエリアネットワークカード)を含む。
入力ドライバ112は、プロセッサ102及び入力デバイス108と通信し、プロセッサ102が入力デバイス108からの入力を受信することを可能にする。出力ドライバ114は、プロセッサ102及び出力デバイス110と通信し、プロセッサ102が出力デバイス110に出力を送信することを可能にする。入力ドライバ112及び出力ドライバ114がオプションのコンポーネントであることと、入力ドライバ112及び出力ドライバ114が存在しない場合には、デバイス100が同じように動作することと、に留意されたい。出力ドライバ114は、ディスプレイデバイス118に結合されたアクセラレーテッドプロセッシングデバイス(APD)を含む。APD116は、計算コマンド及びグラフィックスレンダリングコマンドを処理するために、プロセッサ102から計算コマンド及びグラフィックスレンダリングコマンドを受信し、画素出力を、表示のためにディスプレイデバイス118に提供するように構成されている。以下により詳細に説明するように、APD116は、単一命令複数データ(SIMD)パラダイムに従って計算を実行するように構成された1つ以上の並列プロセッシングユニットを含む。よって、本明細書では、様々な機能がAPD116によって又はAPD116と共に実行されるものとして説明するが、様々な代替例では、APD116によって実行されるものとして説明する機能は、ホストプロセッサ(例えば、プロセッサ102)によって駆動されず、ディスプレイデバイス118に(グラフィカルな)出力を提供するように構成された、同様の機能を有する他のコンピューティングデバイスによって追加的又は代替的に実行される。例えば、SIMDパラダイムに従って処理タスクを実行する任意のシステムが、本明細書で説明する機能を実行するように構成されてもよいことが考えられる。代わりに、SIMDパラダイムに従って処理タスクを実行しないコンピューティングシステムが、本明細書で説明する機能を実行することが考えられる。
図2は、APD116上での処理タスクの実行に関連する追加の詳細を示す、デバイス100のブロック図である。プロセッサ102は、システムメモリ104において、プロセッサ102によって実行される1つ以上の制御ロジックモジュールを維持する。制御ロジックモジュールは、オペレーティングシステム120と、ドライバ122と、アプリケーション126と、を含む。これらの制御ロジックモジュールは、プロセッサ102及びAPD116の動作の様々な特徴を制御する。例えば、オペレーティングシステム120は、ハードウェアと直接通信し、プロセッサ102上で実行される他のソフトウェアのためのハードウェアへのインタフェースを提供する。ドライバ122は、例えば、APD116の様々な機能にアクセスするために、プロセッサ102上で実行されるソフトウェア(例えば、アプリケーション126)へのアプリケーションプログラミングインタフェース(API)を提供することによって、APD116の動作を制御する。いくつかの実施形態では、ドライバ122は、APD116の処理コンポーネント(以下により詳細に説明するSIMDユニット138等)によって実行されるプログラムをコンパイルするジャストインタイムコンパイラを含む。他の実施形態では、プログラムをコンパイルするためにジャストインタイムコンパイラが使用されず、通常のアプリケーションコンコンパイラは、APD116上で実行されるシェーダプログラムをコンパイルする。
APD116は、並列処理及び/又は順序付けされていない処理に適したグラフィックス操作及び非グラフィックス操作等の選択された機能についてのコマンド及びプログラムを実行する。APD116は、プロセッサ102から受信されたコマンドに基づいて、画素演算、幾何学的計算等のグラフィックスパイプライン演算を実行し、画像をディスプレイデバイス118にレンダリングするために使用される。APD116は、プロセッサ102から受信したコマンドに基づいて、ビデオ、物理シミュレーション、計算流体力学、又は、他のタスク等のように、グラフィックス演算に直接関連しない計算処理演算も実行する。
APD116は、SIMDパラダイムに従って、並列方式で、プロセッサ102の要求に応じて動作を実行する1つ以上のSIMDユニット138を含む、計算ユニット132を含む。SIMDパラダイムは、複数の処理要素が、単一のプログラム制御フローユニット及びプログラムカウンタを共有し、これにより、同じプログラムを実行するが、異なるデータでそのプログラムを実行することができる。一例では、各SIMDユニット138は、16個のレーンを含み、各レーンは、SIMDユニット138内の他のレーンと同時に同じ命令を実行するが、異なるデータでその命令を実行する。全てのレーンが所定の命令を実行する必要がない場合には、プレディケーション(predication)を使用してレーンをオフにしてもよい。プレディケーションは、分岐する制御フローでプログラムを実行するためにも使用されてもよい。より具体的には、制御フローが個々のレーンによって実行される計算に基づいている条件付き分岐又は他の命令を有するプログラムの場合、現在実行されていない制御フローパスに対応するレーンのプレディケーション、及び、異なる制御フローパスの連続実行は、任意の制御フローを可能にする。実施形態では、計算ユニット132の各々は、ローカルL1キャッシュを有してもよい。実施形態では、複数の計算ユニット132は、L2キャッシュを共有する。
計算ユニット132における実行の基本単位は、ワークアイテムである。各ワークアイテムは、特定のレーンにおいて並列に実行されるプログラムの単一のインスタンスを表す。ワークアイテムは、単一のSIMDプロセッシングユニット138上で「ウェーブフロント(wavefront)」として同時に実行されてもよい。1つ以上のウェーブフロントが「ワークグループ」に含まれ、ワークグループは、同じプログラムを実行するように指定されたワークアイテムの集合を含む。ワークグループは、ワークグループを構成するウェーブフロントの各々を実行することによって実行される。代替例では、ウェーブフロントは、単一のSIMDユニット138上で順次、又は、異なるSIMDユニット138上で部分的若しくは完全に並列に実行される。ウェーブフロントは、単一のSIMDユニット138上で同時に実行されるワークアイテムの最大の集合として考えられてもよい。よって、プロセッサ102から受信したコマンドが、特定のプログラムが単一のSIMDユニット138上で同時に実行することができない程度に並列に実行されることを示す場合には、そのプログラムは、2つ以上のSIMDユニット138上で並列化されるか、同じのSIMDユニット138上で直列化される(又は、必要に応じて、並列化及び直列化の両方が行われる)ウェーブフロントに分割される。スケジューラ136は、異なる計算ユニット132及びSIMDユニット138上で様々なウェーブフロントをスケジューリングすることに関連する動作を実行するように構成されている。
計算ユニット132によって許容される並列性は、画素値計算、頂点変換、及び、他のグラフィックス演算等のグラフィックス関連演算に適している。よって、場合によっては、プロセッサ102からグラフィックス処理コマンドを受信するグラフィックスパイプライン134は、並列実行のために、計算タスクを計算ユニット132に提供する。
計算ユニット132は、グラフィックスに関連しない計算タスク、又は、グラフィックスパイプライン134の「通常」動作の一部として実行されない計算タスク(例えば、グラフィックスパイプライン134の動作のために実行される処理を補足するように実行されるカスタム動作)を実行するためにも使用される。プロセッサ102上で実行されるアプリケーション126又は他のソフトウェアは、そのような計算タスクを定義するプログラムを、実行のためにAPD116に送信する。
計算ユニット132は、シミュレートされたレイ(光線)とシーン内のオブジェクトとの交差をテストすることによって、3Dシーンをレンダリングする技術であるレイトレーシングを実施する。レイトレーシングに関連する作業の多くは、以下により詳細に説明するように、計算ユニット132のSIMDユニット138上で実行されるプログラム可能なシェーダプログラムによって実行される。また、各計算ユニット132は、レイが三角形と交差するかどうかを判別するためにテストを実行する固定機能ハードウェアアクセラレータ、すなわち、レイ交差ユニット139を含む。
図3は、一例による、レイトレーシング技術を用いてグラフィックスをレンダリングするためのレイトレーシングパイプライン300を示す図である。レイトレーシングパイプライン300は、レイトレーシングを利用してシーンをレンダリングすることに関する動作及びエンティティの概要を提供する。レイ生成シェーダ302と、任意のヒットシェーダ306と、最も近いヒットシェーダ310と、ミスシェーダ312とは、SIMDユニット138で実行されているシェーダプログラムによって機能が実行されるレイトレーシングパイプラインステージを表すシェーダ実装ステージである。特定のシェーダ実装ステージの各々における具体的なシェーダプログラムは、アプリケーション提供コードによって(すなわち、アプリケーションコンパイラによってプリコンパイルされ、及び/又は、ドライバ122によってコンパイルされた、アプリケーション開発者によって提供されたコードによって)定義される。アクセラレーション構造横断ステージ(acceleration structure traversal stage)304は、レイが三角形にヒットするかどうかを判別するためにレイ交差テストを実行する。アクセラレーション構造横断ステージの動作は、レイ交差テストユニット139によって実行される。様々なプログラム可能なシェーダステージ(レイ生成シェーダ302、任意のヒットシェーダ306、最も近いヒットシェーダ310、ミスシェーダ312)は、SIMDユニット138上で実行されるシェーダプログラムとして実装される。アクセラレーション構造横断ステージは、ソフトウェア(例えば、SIMDユニット138上で実行されているシェーダプログラム)、ハードウェア(例えば、レイ交差ユニット139)、又は、ハードウェアとソフトウェアとの組み合わせとして実装される。ヒット又はミスユニット308は、例えば、他のユニットの一部として、ハードウェアアクセラレーテッド構造として、又は、SIMDユニット138上で実行されているシェーダプログラムとして等のように、技術的に実現可能な任意の方法で実装される。レイトレーシングパイプライン300は、部分的若しくは完全にソフトウェアで、又は、部分的若しくは完全にハードウェアで構成されてもよく、プロセッサ102、スケジューラ136、これらの組み合わせによって、又は、任意の他のハードウェア及び/若しくはソフトウェアユニットによって部分的若しくは完全に構成されてもよい。
レイトレーシングパイプライン300は、以下のように動作する。レイ生成シェーダ302が実行される。レイ生成シェーダ302は、三角形に対してテストするためにレイのデータを設定し、三角形との交差に関してレイをテストするようにレイ交差テストユニット139に要求する。
レイ交差テストユニット139は、シーンボリューム及びシーン内のオブジェクトを記述するデータ構造であるアクセラレーション構造をアクセラレーション構造横断ステージ304において横断し、シーン内の三角形に対してレイをテストする。アクセラレーション構造横断ステージ304の一部であり得るヒット又はミスユニット308は、アクセラレーション構造横断ステージ304の結果(重心座標及び潜在的なヒット時間等の生データを含み得る)が実際にヒットを示すかどうかを判別する。三角形がヒットする場合、レイトレーシングパイプライン300は、任意のヒットシェーダ306の実行をトリガする。複数の三角形が、単一のレイによってヒットする場合があることに留意されたい。アクセラレーション構造横断ステージが、レイの原点に最も近いものからレイの原点から最も遠いものの順に、アクセラレーション構造を横断することは保証されない。ヒット又はミスユニット308は、レイがヒットするレイの原点に最も近い三角形に対して、最も近いヒットシェーダ310の実行をトリガし、ヒットする三角形がなかった場合には、ミスシェーダをトリガする。任意のヒットシェーダ306は、レイ交差テストユニット304からのヒットを「拒絶(reject)」することが可能であり、したがって、ヒット又はミスユニット308は、レイ交差テストユニット304によってヒットが見つからないか受け入れられない場合に、ミスシェーダ312の実行をトリガすることに留意されたい。任意のヒットシェーダ306がヒットを「拒絶」し得る状況の一例は、レイ交差テストユニット139がヒットしていると報告する三角形の少なくとも一部が完全に透明である場合である。レイ交差テストユニット139は、形状のみをテストし、透明度についてはテストしないので、少なくともある程度の透明度を有する三角形へのヒットによって起動される任意のヒットシェーダ306は、報告されたヒットが、三角形の透明部分上の「ヒット」であるため、実際にはヒットでないと判別することができる。最も近いヒットシェーダ310の典型的な用途は、材料を、材料のテクスチャに基づいて着色することである。ミスシェーダ312の典型的な用途は、スカイボックスによって設定された色で画素を着色することである。最も近いヒットシェーダ310及びミスシェーダ312に対して定義されたシェーダプログラムは、画素を着色及び/又は他の操作を実行するための多種多様な技術を実施し得ることを理解されたい。
レイ生成シェーダ302がレイを生成する典型的な方法は、後方レイトレーシング(backwards ray tracing)と呼ばれる技術である。後方レイトレーシングでは、レイ生成シェーダ302は、カメラの点に原点を有するレイを生成する。画面に対応するように定義された平面に対してレイが交差する点は、レイが色を決定するために使用される画面上のピクセルを定義する。レイがオブジェクトにヒットする場合、そのピクセルは、最も近いヒットシェーダ310に基づいて着色される。レイがオブジェクトにヒットしない場合、ピクセルは、ミスシェーダ312に基づいて着色される。ピクセル毎に複数のレイがキャストされてもよく、ピクセルの最終的な色は、ピクセルのレイ毎に決定された色の組み合わせによって決められる。
任意のヒットシェーダ306、最も近いヒットシェーダ310、及び、ミスシェーダ312の何れかは、レイテストポイントにおいてレイトレーシングパイプライン300に入る独自のレイを生成することが可能である。これらのレイは、あらゆる目的に使用することができる。一般的な用途の1つは、環境照明又は反射を実装することである。一例では、最も近いヒットシェーダ310が呼び出されると、最も近いヒットシェーダ310は、様々な方向にレイを生成する。生成されたレイがヒットするオブジェクト又は光毎に、最も近いヒットシェーダ310は、最も近いヒットシェーダ310に対応するピクセルに対して照明強度及び色を追加する。レイトレーシングパイプライン300の様々なコンポーネントを使用してシーンをレンダリングすることができる方法のいくつかの例を説明しているが、多種多様な技術の何れかを代替的に使用し得ることを理解されたい。
上述したように、レイがオブジェクトにヒットするかどうかの判別は、本明細書において「レイ交差テスト」と呼ばれる。レイ交差テストは、原点からレイを発射し、レイが三角形にヒットするかどうか、ヒットする場合には、原点から三角形にヒットするまでの距離を決定することを含む。効率を高めるために、レイトレーシングテストは、境界ボリューム階層と呼ばれる空間の表現を用いる。この境界ボリューム階層は、上述した「アクセラレーション構造」である。境界ボリューム階層では、非リーフノード(non-leaf node)の各々は、そのノードのすべての子のジオメトリに境界を付ける軸合わせされた境界ボックス(axis aligned bounding box)を表す。例えば、ベースノードは、レイ交差テストが実行されている領域全体の最大範囲を表す。この例では、ベースノードに2つの子があり、各々が、領域全体を分割する相互に排他的な軸合わせされた境界ボックスを表す。これらの2つの子の各々は、これらの親の空間を分割する軸合わせされた境界ボックスを表す2つの子ノード等を有する。リーフノードは、レイテストを実行することができる三角形を表す。
境界ボリューム階層データ構造により、(複雑であり、処理リソースの観点からコストがかかる)レイ及び三角形の交差の数を、このようなデータ構造が使用されなかったためにシーン内の全ての三角形をレイに対してテストする必要があるシナリオと比較して、減らすことが可能になる。具体的には、レイが特定の境界ボックスと交差せず、その境界ボックスが多数の三角形の境界となる場合、そのボックス内の全ての三角形をテストから除外することができる。したがって、レイ交差テストは、軸合わせされた境界ボックスに対するレイのテストのシーケンスとして実行され、続けて三角形に対するテストが実行される。
図4は、一例による、境界ボリューム階層を示す図である。簡潔さのために、階層を2Dで示す。しかしながら、3Dへの拡張は簡単であり、本明細書で説明するテストは、概して、3次元で実行されることを理解されたい。
境界ボリューム階層の空間表現402を図4の左側に示し、境界ボリューム階層のツリー表現404を図4の右側に示す。空間表現402及びツリー表現404の両方において、非リーフノードが文字「N」で表され、リーフノードが文字「O」で表される。レイ交差テストは、ツリー404を横断することによって実行され、テストされた非リーフノード毎に、その非リーフノードのテストが失敗した場合、そのノードの下のブランチを除去する。例えば、レイは、O5と交差するが、他の三角形とは交差しない。テストは、N1に対してテストを行い、テストが成功したと判別する。テストは、N2に対してテストを行い、(O5がN1内にないため)テストが失敗したと判別する。テストは、N2の全てのサブノードを除去し、N3に対してテストを行い、そのテストが成功したことを示す。テストは、N6及びN7をテストし、N6については成功したがN7については失敗したことを示す。テストは、O5及びO6をテストし、O5については成功したがO6については失敗したことを示す。8個の三角形をテストする代わりに、2つの三角形のテスト(O5とO6)及び5つのボックスのテスト(N1、N2、N3、N6及びN7)が実行される。
レイ・三角形テストでは、レイが三角形にヒットするかどうか、及び、三角形にヒットするまでの時間(レイの原点から交点までの時間)を確認することを含む。概念的には、レイ・三角形テストは、三角形をレイのビュースペースに投影することによって、グラフィックス処理パイプラインで一般的に実行される三角形の2次元ラスタライズでのカバレージのテストと同様の簡単なテストの実行を可能にすることを含む。より具体的には、三角形をレイのビュースペースに投影すると、座標系が変換され、レイがz方向において下方を指すようになり、レイのx成分及びy成分が0になる(ただし、いくつかの変形例では、レイが、z方向において、又は、正若しくは負のx若しくはy方向において上方を指し、他の2つの軸における成分がゼロである場合がある)。三角形の頂点は、この座標系に変換される。このような変換により、レイのx、y座標が三角形の頂点のx、y座標によって画定される三角形内にあるかどうかを確認するだけで、交差のテストを行うことが可能になり、これは、上述したラスタライズ動作である。
この変換を図5に示す。レイ502及び三角形504が、変換前の座標系500に示されている。変換された座標系510の座標系において、レイ512は、-z方向を指しているように示され、三角形514も、その座標系510に示されている。
図6は、ラスタライズ動作としてのレイ交差テストを示す図である。具体的には、頂点A、B、Cが三角形514を画定し、頂点Tがレイ512の原点である。レイ512が三角形514と交差するかどうかのテストは、頂点Tが三角形ABC内にあるかどうかをテストすることによって実行される。これについては、以下により詳しく説明する。
ここで、レイ・三角形テストのさらなる詳細を示す。先ず、座標系を回転させて、z軸がレイの主軸となるようにする(「主軸」とは、レイが最も速く進む軸を意味する)。この回転は、レイ方向のz成分が0であるいくつかのエッジケース(edge cases)や、レイ方向のz成分が小さい場合に生じる数値安定性の低下を回避するために行われる。座標系の回転は、以下のように実行される。
int kz=0;
float largest_dim=fabs(ray_dir.x);
if(largest_dim<fabs(ray_dir.y)){
kz=1;
largest_dim=fabs(ray_dir.y);
}
if(largest_dim<fabs(ray_dir.z)){
kz=2;
largest_dim=fabs(ray_dir.z);
}
if(kz==2){
ray_dir=ray_dir;
ray_origin=ray_origin;
v0=v0;
v1=v1;
v2=v2;
}else if(kz==1){
ray_dir=ray_dir.zxy;
ray_origin=ray_origin.zxy;
v0=v0.zxy;
v1=v1.zxy;
v2=v2.zxy;
}else{
ray_dir=ray_dir.yzx;
ray_origin=ray_origin.yzx;
v0=v0.yzx;
v1=v1.yzx;
v2=v2.yzx;
}
int kz=0;
float largest_dim=fabs(ray_dir.x);
if(largest_dim<fabs(ray_dir.y)){
kz=1;
largest_dim=fabs(ray_dir.y);
}
if(largest_dim<fabs(ray_dir.z)){
kz=2;
largest_dim=fabs(ray_dir.z);
}
if(kz==2){
ray_dir=ray_dir;
ray_origin=ray_origin;
v0=v0;
v1=v1;
v2=v2;
}else if(kz==1){
ray_dir=ray_dir.zxy;
ray_origin=ray_origin.zxy;
v0=v0.zxy;
v1=v1.zxy;
v2=v2.zxy;
}else{
ray_dir=ray_dir.yzx;
ray_origin=ray_origin.yzx;
v0=v0.yzx;
v1=v1.yzx;
v2=v2.yzx;
}
ここで、kzは、軸を回転する方法を決定するために使用されるヘルパー変数であり、largest_dimは、レイの最大寸法であり、ray_dirは、レイの方向を定義するfloat3であり、ray_originは、レイの原点を定義するfloat3であり、v0、v1、v2は、三角形の頂点を定義するfloat3であり、fabs()は、浮動小数点の絶対値関数である。.zxy又は.yzxをfloat3に追加すると、float3.zxyが回転する。.zxyでは、新しいx成分が古いz成分になり、新しいy成分が新しいx成分になり、新しいz成分が古いz成分になる。.yzxでは、新しいx成分が古いy成分になり、新しいy成分が古いz成分になり、新しいz成分が古いx成分になる。上記の擬似コードは、ray_directionベクトルの何れのコンポーネントが最大の絶対値を有するかを判別する。z成分が最大の場合、kzが2に設定され、回転が実行されない。y成分が最大の場合、kzが1に設定され、レイ及び頂点は、z軸が古いy軸になるように回転する。x成分が最大の場合、kzが0に設定され、レイ及び頂点は、z軸が古いx軸になるように回転する。
次に、頂点は、全て、レイの原点を基準として変換される。
float3 v0_rel=v0-ray_origin;
float3 v1_rel=v1-ray_origin;
float3 v2_rel=v2-ray_origin;
float3 v0_rel=v0-ray_origin;
float3 v1_rel=v1-ray_origin;
float3 v2_rel=v2-ray_origin;
次に、交差の計算を単純化するために、レイ及び三角形の頂点に線形変換を適用して、2Dでテストを実行可能にする。この線形変換は、各頂点及びレイ方向に変換行列Mを乗算することによって行われる。上記の変換ステップにより、ray_originが<0,0,0>にあるので、レイ方向をこのように変換することができる。行列Mは、次のとおりである。
行列の乗算は次のように行われる。
float Ax=v0_rel.x*ray_dir.z-ray_dir.x*v0_rel.z;
float Ay=v0_rel.y*ray_dir.z-ray_dir.y*v0_rel.z;
float Az=v0_rel.z;
float Bx=v1_rel.x*ray_dir.z-ray_dir.x*v1_rel.z;
float By=v1_rel.y*ray_dir.z-ray_dir.y*v1_rel.z;
float Bz=v1_rel.z;
float Cx=v2_rel.x*ray_dir.z-ray_dir.x*v2_rel.z;
float Cy=v2_rel.y*ray_dir.z-ray_dir.y*v2_rel.z;
float Cz=v2_rel.z;
float Ax=v0_rel.x*ray_dir.z-ray_dir.x*v0_rel.z;
float Ay=v0_rel.y*ray_dir.z-ray_dir.y*v0_rel.z;
float Az=v0_rel.z;
float Bx=v1_rel.x*ray_dir.z-ray_dir.x*v1_rel.z;
float By=v1_rel.y*ray_dir.z-ray_dir.y*v1_rel.z;
float Bz=v1_rel.z;
float Cx=v2_rel.x*ray_dir.z-ray_dir.x*v2_rel.z;
float Cy=v2_rel.y*ray_dir.z-ray_dir.y*v2_rel.z;
float Cz=v2_rel.z;
行列Mは、変換されたレイ方向が常に<0,0,ray_dir.z>となるように構成されているので、レイ方向を行列Mで明示的に変換する必要がない。これは、以下の理由によるものである。
ray_dir.x=ray_dir.x*ray_dir.z-ray_dir.z*ray_dir.x=0
ray_dir.y=ray_dir.y*ray_dir.z-ray_dir.z*ray_dir.y=0
ray_dir.z=ray_dir.z
ray_dir.x=ray_dir.x*ray_dir.z-ray_dir.z*ray_dir.x=0
ray_dir.y=ray_dir.y*ray_dir.z-ray_dir.z*ray_dir.y=0
ray_dir.z=ray_dir.z
概念的には、行列Mは、レイ方向がray_dir.zの大きさのz成分のみを有するように座標をスケーリングし、剪断する。このように変換された頂点を用いて、レイ・三角形テストが2Dラスタライズテストとして実行される。図6は、頂点A、B、Cを有する三角形602を示す図である。レイ604も示されている(点T)。頂点及びレイに対して実行された変換により、レイは-z方向を指している。また、三角形は、レイが-z方向を指す座標系に投影されるので、三角形・レイテストは、レイの原点が頂点A、B、Cのx、y座標で画定される三角形内にあるかどうかのテストとして再定式化される。さらに、上記の変換により、レイの原点は2Dの点(0,0)にあり、レイ及び三角形の交点(T)も2Dの点(0,0)にあり、三角形の頂点間の距離(頂点Aの場合にはA-T、頂点Bの場合にはB-T、頂点Cの場合にはC-T)は、レイと三角形の交点が(0,0)にあるため、単にA、B、Cとなる。
次に、三角形の重心座標U、V、W(図6に示す)が、次の方法で計算される。
U=area(Triangle CBT)=0.5×(C×B)
V=area(Triangle ACT)=0.5×(A×C)
W=area(Triangle BAT)=0.5×(B×A)
U=area(Triangle CBT)=0.5×(C×B)
V=area(Triangle ACT)=0.5×(A×C)
W=area(Triangle BAT)=0.5×(B×A)
この計算は、次のように簡略化される。
float U=Cx×By-Cy×Bx;
float V=Ax×Cy-Ay×Cx;
float W=Bx×Ay-By×Ax;
2による除算は最終結果において無効になるので、除算は利用されない。
float U=Cx×By-Cy×Bx;
float V=Ax×Cy-Ay×Cx;
float W=Bx×Ay-By×Ax;
2による除算は最終結果において無効になるので、除算は利用されない。
U、V、Wの符号は、レイが三角形と交差するかどうかを示す。より具体的には、U、V、Wが全て正の場合、又は、U、V、Wが全て負の場合、点Tは、図6の三角形の内側にあるので、レイが三角形と交差するとみなされる。U、V、Wの符号が異なる場合、点Tは、図6の三角形の外側にあるので、レイが三角形と交差しない。U、V、Wのうち何れか1つのみがゼロの場合、点Tは、その座標に対応するエッジを通る線上にある。この場合、他の2つの座標の符号が同じである場合には、点Tは、三角形602のエッジ上にあるが、他の2つの座標の符号が異なる場合には、点Tは、三角形のエッジ上にない。U、V、Wのうち2つのみがゼロの場合、点Tは、三角形の角にあるとみなされる。U、V、Wが全てゼロの場合、三角形は、面積がゼロの三角形である。もう1つのポイントとして、点Tが2Dにおいて三角形の内側にあり得る(レイが上記の三角形と交差しているものとして示される)が、レイが三角形の後ろにある場合には、3D空間において三角形に当たらない場合がある。以下に説明するtの符号は、レイが三角形の後ろにある(したがって交差しない)かどうかを示す。具体的には、符号が負の場合、レイは三角形の後ろにあり、三角形と交差しない。符号が正又は0の場合、レイは三角形と交差する。
様々な実施形態では、点がエッジ又は角上にある場合、又は、三角形がゼロ面積の三角形である場合には、ヒット又はミスの何れかと考えられ得る。言い換えれば、エッジ上にある点がヒットかミスかの判別、及び/又は、角上の点がヒットかミスかの判別は、特定のポリシーに依存している。例えば、いくつかの実施形態では、点がエッジ又は角上にある全てのインスタンスがヒットとみなされる。他の実施形態では、そのようなインスタンスは全てミスとみなされる。さらに他の実施形態では、そのようないくつかのインスタンス(特定の方向を向いているエッジ上にある点Tな等)はヒットとみなされ、他のこのようなインスタンスはミスとみなされる。
さらに、レイが三角形にヒットする時間tが求められる。これは、三角形の全ての頂点のZ値を補間することによって、既に計算された三角形の重心座標(U、V、W)を用いて行われる。最初に、点T(レイ及び三角形の交点)のz成分が計算される。
ここで、Azは、ベクトルAのz成分であり、Bzは、ベクトルBのz成分であり、Czは、ベクトルCのz成分であり、U、V、Wは、上記で計算された重心座標である。T.x及びT.yがゼロであるため、Tは(0,0,T.z)である。時間tは、次のように計算される。
ここで、distance()は2点間の距離を表し、length()はベクトルの長さを表す。交差時間tの最終式は次のとおりである。
ここで、Azは、ベクトルAのz成分であり、Bzは、ベクトルBのz成分であり、Czは、ベクトルCのz成分であり、U、V、Wは、上記で計算された重心座標である。T.x及びT.yがゼロであるため、Tは(0,0,T.z)である。時間tは、次のように計算される。
ここで、distance()は2点間の距離を表し、length()はベクトルの長さを表す。交差時間tの最終式は次のとおりである。
この値は、ハードウェア交差ユニットによって、分子及び分母の形式(t_numはtの分子、t_denomはtの分母)でシェーダ(例えば、図3の何れかのシェーダ)に提供される。
float t_num=U*Az+V*Bz+W*Cz;
float t_denom=U*ray_dir.z+V*ray_dir.z+W*ray_dir.z
float t_num=U*Az+V*Bz+W*Cz;
float t_denom=U*ray_dir.z+V*ray_dir.z+W*ray_dir.z
上述したように、重心座標は、以下のように計算される。
U=Cx×By-Cy×Bx
V=Ax×Cy-Ay×Cx
W=Bx×Ay-By×Ax
U=Cx×By-Cy×Bx
V=Ax×Cy-Ay×Cx
W=Bx×Ay-By×Ax
いくつかの理由により、これらの計算が正しく行われなかった場合に、隙間のなさが損なわれる可能性がある(すなわち、エッジを共有する三角形間にギャップが存在する)。図7は、エッジを共有する2つの三角形の例を示す図である。第1の三角形702は、頂点A1、B1、C1を有する。第2の三角形704は、頂点A2、B2、C2を有する。三角形702及び三角形704は、エッジ706を共有する。また、レイの点Tは、エッジ706に近い特定の位置に示されている。頂点の座標は、レイの点Tと等しい原点を有するように変換されるので、計算が両方の三角形に対して実行された場合、三角形702の頂点C1は、三角形704の頂点B2と全く同じ位置にあり、頂点B1は、三角形706の頂点C2と全く同じ位置にある。
エッジ706の重心座標は、三角形702の場合には座標U1であり、三角形704の場合には座標U2である。これらの座標は、以下の方法で計算される。
U1=C1x×B1y-C1y×B1x
U2=C2x×B2y-C2y×B2x
B1x及びB1yは、それぞれB1のx成分及びy成分であり、C1x及びC1yは、それぞれC1のx成分及びy成分であり、B2x及びB2yは、それぞれB2のx成分及びy成分であり、C2x及びC2yは、それぞれC2のx成分及びy成分である。C2はB1と同じであり、B2はC1と同じであることに留意されたい。したがって、座標U2の計算は、以下のように記述され得る。
U2=B1x×C1y-B1y×C1x
U1=C1x×B1y-C1y×B1x
U2=C2x×B2y-C2y×B2x
B1x及びB1yは、それぞれB1のx成分及びy成分であり、C1x及びC1yは、それぞれC1のx成分及びy成分であり、B2x及びB2yは、それぞれB2のx成分及びy成分であり、C2x及びC2yは、それぞれC2のx成分及びy成分である。C2はB1と同じであり、B2はC1と同じであることに留意されたい。したがって、座標U2の計算は、以下のように記述され得る。
U2=B1x×C1y-B1y×C1x
隙間のなさを生じさせるには、U2を、常に-U1と等しくする必要がある。言い換えれば、U2は、常にU1と反対の符号を有する(又は、U2及びU1の両方が0になる)。これは、U1及びU2の両方が同じ符号を有する場合、レイTは、両方の三角形に対してミスとなる可能性があるためである。例えば、両方の三角形のV及びWが正であった場合、U1及びU2の両方が負であった場合、レイTは、両方の三角形に対してミスになる。点Tが、少なくとも1つの三角形にヒットする必要があるため、この状況は望ましくない。そうでなければ、両方に対してミスが発生し、穴として表示される可能性がある。
浮動小数点演算が機能する方法のため、全ての浮動小数点丸めモードでU2が常に-U1と等しくなるわけではない。具体的には、有向であるとみなされる浮動小数点丸めモードが、必ずしも上記の結果をもたらすとは限らず、無向であるとみなされる浮動小数点丸めモードが、上記の結果(すなわち、U2が-U1に等しくなる)をもたらす。浮動小数点演算がどのように機能するかを簡単に説明した後に、有向及び無向の丸めモードについて説明する。
浮動小数点数には、概念的に仮数、基数及び指数が含まれる。浮動小数点数の値は、基数を指数で累乗した値を仮数に乗じたものと等しい。丸めを含む算術演算の場合、丸めは、算術演算が無限の精度で計算され、仮数が利用可能なビット数に収まるように変更された(例えば、より高精度のビットが削除される)場合と同じ結果が得られるように適用される。
ゼロへの丸め(RTZ)、最も近い偶数への丸め(RTNE)、正の無限大への丸め(RTP)、及び、負の無限大への丸め(RTN)等のように、いくつかの異なる丸めモードがある。RTZ及びRTNEは共に無向丸めモードであり、RTP及びRTNは共に有向丸めモードである。丸めモードの「方向性」は、仮数の大きさが丸められる方法が浮動小数点数の符号に依存することを意味する。例示的な数では、丸められていない仮数は、値1010[01]を有し、括弧内の部分は、使用可能なビットが不足しているために(すなわち、仮数に使用可能なのは4ビットのみである)、浮動小数点数の精度で表すことができない部分である。RTZモードでは、仮数の大きさがゼロに向けて丸められるので、仮数が1010に丸められる。これは、数値が正の符号を有するか負の符号を有するかに関係なく当てはまる。RTNEでは、仮数が1010に丸められ、これは、丸められていない仮数に最も近い偶数である。対照的に、RTPモードでは、仮数が、符号に応じて異なるように丸められる。具体的には、符号が正の場合、仮数は、正の無限大に向かって1011に丸められる。符号が負の場合、小さい負の数が大きい負の数よりも正の無限大に近いので、仮数が1010に丸められる。RTNモードでは、結果が逆になる(数が負の場合には仮数が1011に丸められ、数が正の場合には1010に丸められる)。
上記の理由により、常にround(X)=-round(-X)(「round()」は浮動小数点丸め演算を示す)であるとは限らない。具体的には、有向丸めモードでは、round(X)の大きさは、round(-X)の大きさと異なる場合がある。このため、U2=B1x×C1y-B1y×C1xが常に-U1と等しいわけではない可能性があり、それは-(C1y×B1x-C1x×B1y)と等しい(注、U1=C1x×B1y-C1y×B1xであり、それは(-C1x×B1y+C1y×B1x)に等しく、それは-(C1x×B1y-C1y×B1x)に等しい)。より具体的には、有向丸めモードが用いられる場合、丸められた数の各々の仮数の大きさは、それらの数の符号に基づいて変化するので、round(-round(C1x×B1y)+round(C1y×B1x))が-round(round(C1x×B1y)-round(C1y×B1x))と等しくない可能性がある。有向丸めモードで発生し得る大きさの僅かなシフトのために、U1及びU2の両方が同じ符号を有する可能性があり、そのことは、隙間のなさを破るであろう。図7に示す2つの三角形702,704の例では、点Tが両方の三角形に対してミスとみなされる可能性がある。
上記の理由により、重心座標の計算は、有向丸めモードを用いて実行される。いくつかの実施形態では、RTZ又はRTNEの何れかが、有向丸めモードとして用いられる。いくつかの実施形態では、RTNEよりもRTZの方がハードウェアでの実装が簡単であるため、RTZが用いられる。さらに、いくつかの実施形態では、重心座標を決定し、tを計算するための全ての乗算及び加算演算は、無向丸めモードを用いる(有向丸めモードではない)。これにより、関係する数値が正であるか負であるかに関係なく、これらの計算に対して仮数の値が同じになり、隙間のないレンダリングをもたらす。これらの計算には、頂点をレイの原点に対して変換する計算、行列Mによる乗算を介したレイのビュースペースへの投影、重心座標の計算、及び、レイ及び三角形の交差時間tを決定するための重心座標の補間が含まれる。一例では、以下の計算、すなわち、頂点からレイの原点を減算する変換計算、上述したような頂点x、y、z成分のレイ方向z成分による乗算及び積の減算を含むAx、Ay、Bx、By、Cx、Cyを決定するための各計算、上述したU、V、Wを決定するための各計算、上述したT.zの分子及び分母を決定するための各計算は、無向丸めモードで実行される。明示的に言えば、以下の計算は、無向丸めモードで実行される。
float3 v0_rel=v0-ray_origin;
float3 v1_rel=v1-ray_origin;
float3 v2_rel=v2-ray_origin;
float Ax=v0_rel.x×ray_dir.z-ray_dir.x×v0_rel.z;
float Ay=v0_rel.y×ray_dir.z-ray_dir.y×v0_rel.z;
float Bx=v1_rel.x×ray_dir.z-ray_dir.x×v1_rel.z;
float By=v1_rel.y×ray_dir.z-ray_dir.y×v1_rel.z;
float Cx=v2_rel.x×ray_dir.z-ray_dir.x×v2_rel.z;
float Cy=v2_rel.y×ray_dir.z-ray_dir.y×v2_rel.z;
float U=Cx×By-Cy×Bx;
float V=Ax×Cy-Ay×Cx;
float W=Bx×Ay-By×Ax;
float t_num=U×Az+V×Bz+W×Cz;
float t_denom=U×ray_dir.z+V×ray_dir.z+W×ray_dir.z
float3 v0_rel=v0-ray_origin;
float3 v1_rel=v1-ray_origin;
float3 v2_rel=v2-ray_origin;
float Ax=v0_rel.x×ray_dir.z-ray_dir.x×v0_rel.z;
float Ay=v0_rel.y×ray_dir.z-ray_dir.y×v0_rel.z;
float Bx=v1_rel.x×ray_dir.z-ray_dir.x×v1_rel.z;
float By=v1_rel.y×ray_dir.z-ray_dir.y×v1_rel.z;
float Cx=v2_rel.x×ray_dir.z-ray_dir.x×v2_rel.z;
float Cy=v2_rel.y×ray_dir.z-ray_dir.y×v2_rel.z;
float U=Cx×By-Cy×Bx;
float V=Ax×Cy-Ay×Cx;
float W=Bx×Ay-By×Ax;
float t_num=U×Az+V×Bz+W×Cz;
float t_denom=U×ray_dir.z+V×ray_dir.z+W×ray_dir.z
いくつかの例では、レイ・三角形の交差テストを実行するための上記の動作の全ては、レイ交差ユニット139によって実行される。
本明細書における開示に基づいて、多くの変形が可能であることを理解されたい。特徴及び要素が特定の組み合わせで上述されているが、各特徴又は要素は、他の特徴及び要素無しに単独で、又は、他の特徴及び要素を伴う若しくは伴わない様々な組み合わせで使用されてもよい。
提供された方法は、汎用コンピュータ、プロセッサ又はプロセッサコアにおいて実施することができる。好適なプロセッサは、例えば、汎用プロセッサ、専用プロセッサ、従来のプロセッサ、デジタルシグナルプロセッサ(DSP)、複数のマイクロプロセッサ、DSPコアと協働する1つ以上のマイクロプロセッサ、コントローラ、マイクロコントローラ、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)回路、他の任意のタイプの集積回路(IC)、及び/又は、状態機械を含む。このようなプロセッサは、処理されたハードウェア記述言語(HDL)命令の結果と、ネットリストを含む他の中間データ(コンピュータ可読媒体に記憶することができる命令)と、を使用して製造プロセスを構成することによって、製造することができる。このような処理の結果は、本開示の特徴を実装するプロセッサを製造するための半導体製造プロセスで後に使用されるマスクワークとすることができる。
本明細書で提供される方法又はフローチャートは、汎用コンピュータ又はプロセッサによって実行されるために非一時的なコンピュータ可読記憶媒体に組み込まれたコンピュータプログラム、ソフトウェア又はファームウェアで実装することができる。非一時的なコンピュータ可読記憶媒体の例は、リードオンリメモリ(ROM)、ランダムアクセスメモリ(RAM)、レジスタ、キャッシュメモリ、半導体メモリデバイス、内蔵ハードディスク及びリムーバブルディスク等の磁気媒体、光磁気媒体、CD-ROMディスク及びデジタル多用途ディスク(DVD)等の光学媒体を含む。
Claims (20)
- レイと三角形との間のヒットを検出する方法であって、
前記三角形の頂点及び前記レイの方向の頂点表現を、前記レイの方向が0であるx成分及びy成分を有し、前記頂点及び前記レイの各々が座標変換ユニットによって変更されていないz成分を有する座標系に変換することによって、前記レイのビュースペースに前記三角形の前記頂点を投影することと、
二次元空間における前記三角形の前記頂点に対する前記レイの交点の位置を示す重心座標を決定することであって、前記重心座標の決定は無向丸めモードを用いて実行される、ことと、
前記重心座標を補間して、前記レイが前記三角形と交差する時間の分子及び分母を生成することと、を含む、
方法。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、符号に依存しない方法で丸められる浮動小数点丸めモードを含む、
請求項1の方法。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、丸め後に前記仮数が丸め前よりも小さくなるように丸められる、ゼロに向かう丸めモードを含む、
請求項2の方法。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、最も近い偶数に丸められる、最も近い偶数への丸めモードを含む、
請求項2の方法。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、前記仮数の大きさが符号によって増加又は減少するように丸められる浮動小数点丸めモードを有する有向丸めモードを含まない、
請求項1の方法。 - 前記有向丸めモードは、正の無限大への丸めモード又は負の無限大への丸めモードを含む、
請求項5の方法。 - 前記三角形の前記頂点及び前記レイの方向の頂点表現を前記座標系に変換することは、無向丸めモードで浮動小数点計算を実行することを含む、
請求項1の方法。 - 前記重心座標を決定することは、重心座標をCxBy-BxCyとして計算するステップを含み、Cx及びCyは、前記重心座標に関連するエッジを境界づける頂点のうち1つの頂点のx座標及びy座標であり、Bx及びByは、前記重心座標に関連するエッジを境界づける頂点のうち他の頂点のx座標及びy座標である、
請求項1の方法。 - 前記重心座標を決定することは、CxByの積を無向丸めモードにしたがって丸めることと、BxCyの積を無向丸めモードにしたがって丸めることと、CxBy-BxCyの差を無向丸めモードにしたがって丸めることと、を含む、
請求項8の方法。 - レイと三角形との間の交差のテストを要求するように構成された処理ユニットと、
レイ交差テストユニットと、を備え、
前記レイ交差テストユニットは、
前記三角形の頂点及び前記レイの方向の頂点表現を、前記レイの方向が0であるx成分及びy成分を有し、前記頂点及び前記レイの各々が座標変換ユニットによって変更されていないz成分を有する座標系に変換することによって、前記レイのビュースペースに前記三角形の前記頂点を投影することと、
二次元空間における前記三角形の前記頂点に対する前記レイの交点の位置を示す重心座標を決定することであって、前記重心座標の決定は無向丸めモードを用いて実行される、ことと、
前記重心座標を補間して、前記レイが前記三角形と交差する時間の分子及び分母を生成することと、
によって前記テストを実行するように構成されている、
計算ユニット。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、符号に依存しない方法で丸められる浮動小数点丸めモードを含む、
請求項10の計算ユニット。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、丸め後に前記仮数が丸め前の大きさよりも小さくなるように丸められる、ゼロに向かう丸めモードを含む、
請求項10の計算ユニット。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、前記最も近い偶数に丸められる、最も近い偶数への丸めモードを含む、
請求項11の計算ユニット。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、前記仮数の大きさが符号によって増加又は減少するように丸められる浮動小数点丸めモードを有する有向丸めモードを含まない、
請求項10の計算ユニット。 - 前記有向丸めモードは、正の無限大への丸めモード又は負の無限大への丸めモードを含む、
請求項14の計算ユニット。 - 前記三角形の前記頂点及び前記レイの方向の頂点表現を前記座標系に変換することは、無向丸めモードで浮動小数点計算を実行することを含む、
請求項10の計算ユニット。 - 前記重心座標を決定することは、重心座標をCxBy-BxCyとして計算するステップを含み、Cx及びCyは、前記重心座標に関連するエッジを境界づける頂点のうち1つの頂点のx座標及びy座標であり、Bx及びByは、前記重心座標に関連するエッジを境界づける頂点のうち他の頂点のx座標及びy座標である、
請求項10の計算ユニット。 - 前記重心座標を決定することは、CxByの積を無向丸めモードにしたがって丸めることと、BxCyの積を無向丸めモードにしたがって丸めることと、CxBy-BxCyの差を無向丸めモードにしたがって丸めることと、を含む、
請求項17の計算ユニット。 - シェーダプログラムを実行のためにアクセラレーテッドプロセッシングデバイスに送信するように構成された中央処理装置と、
計算ユニットを含む前記アクセラレーテッドプロセッシングデバイスと、を備え、
前記計算ユニットは、
レイと三角形との間の交差のテストを要求するために前記シェーダプログラムを実行するように構成された処理ユニットと、
レイ交差テストユニットと、を備え、
前記レイ交差テストユニットは、
前記三角形の頂点及び前記レイの方向の頂点表現を、前記レイの方向が0であるx成分及びy成分を有し、前記頂点及び前記レイの各々が座標変換ユニットによって変更されていないz成分を有する座標系に変換することによって、前記レイのビュースペースに前記三角形の前記頂点を投影することと、
二次元空間における前記三角形の前記頂点に対する前記レイの交点の位置を示す重心座標を決定することであって、前記重心座標の決定は無向丸めモードを用いて実行される、ことと、
前記重心座標を補間して、前記レイが前記三角形と交差する時間の分子及び分母を生成することと、
によって前記テストを実行するように構成されている、
計算システム。 - 前記無向丸めモードは、前記重心座標の仮数及び/又は前記重心座標を計算するために用いられる中間値の仮数が、符号に依存しない方法で丸められる浮動小数点丸めモードを含む、
請求項19の計算システム。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US16/219,820 | 2018-12-13 | ||
US16/219,820 US20200193685A1 (en) | 2018-12-13 | 2018-12-13 | Water tight ray triangle intersection without resorting to double precision |
PCT/US2019/059944 WO2020123060A1 (en) | 2018-12-13 | 2019-11-05 | Water tight ray triangle intersection without resorting to double precision |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2022510804A true JP2022510804A (ja) | 2022-01-28 |
Family
ID=71071799
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2021527088A Pending JP2022510804A (ja) | 2018-12-13 | 2019-11-05 | 倍精度を用いない隙間のないレイと三角形との交差 |
Country Status (6)
Country | Link |
---|---|
US (1) | US20200193685A1 (ja) |
EP (1) | EP3895133A1 (ja) |
JP (1) | JP2022510804A (ja) |
KR (1) | KR20210092231A (ja) |
CN (1) | CN113168728A (ja) |
WO (1) | WO2020123060A1 (ja) |
Families Citing this family (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US11341709B2 (en) * | 2019-09-27 | 2022-05-24 | Intel Corporation | Apparatus and method using triangle pairs and shared transformation circuitry to improve ray tracing performance |
US11450057B2 (en) * | 2020-06-15 | 2022-09-20 | Nvidia Corporation | Hardware acceleration for ray tracing primitives that share vertices |
GB2599184B (en) | 2021-03-23 | 2022-11-23 | Imagination Tech Ltd | Intersection testing in a ray tracing system |
GB2599185B (en) * | 2021-03-23 | 2022-08-24 | Imagination Tech Ltd | Intersection testing in a ray tracing system |
GB2605567B (en) * | 2021-03-23 | 2023-06-21 | Imagination Tech Ltd | Performing operations using floating point values |
GB2599186B (en) * | 2021-03-23 | 2022-10-12 | Imagination Tech Ltd | Intersection testing in a ray tracing system |
GB2599181B (en) | 2021-03-23 | 2022-11-16 | Imagination Tech Ltd | Intersection testing in a ray tracing system |
US20230206541A1 (en) * | 2021-12-28 | 2023-06-29 | Advanced Micro Devices, Inc. | Common circuitry for triangle intersection and instance transformation for ray tracing |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7952583B2 (en) * | 2000-06-19 | 2011-05-31 | Mental Images Gmbh | Quasi-monte carlo light transport simulation by efficient ray tracing |
JP4972642B2 (ja) * | 2005-06-23 | 2012-07-11 | メンタル イメージス, ゲーエムベーハー | 高精度の実時間レイトレーシング |
US8237711B2 (en) * | 2007-11-19 | 2012-08-07 | Caustic Graphics, Inc. | Tracing of shader-generated ray groups using coupled intersection testing |
US9280449B2 (en) * | 2012-05-10 | 2016-03-08 | Sap Se | HIT testing of visual objects |
CN103473814B (zh) * | 2013-09-23 | 2016-01-20 | 电子科技大学中山学院 | 一种基于gpu的三维几何图元拾取方法 |
KR102161749B1 (ko) * | 2013-10-21 | 2020-10-05 | 삼성전자 주식회사 | 화상의 렌더링을 위하여 광선 추적을 수행하는 방법 및 장치. |
US9984492B2 (en) * | 2015-04-02 | 2018-05-29 | Qualcomm Incorporated | Efficient hierarchy traversal in ray tracing applications |
CN105160698B (zh) * | 2015-08-21 | 2018-12-18 | 天津大学 | 一种三角化射线跟踪路径搜索方法 |
US10102668B2 (en) * | 2016-05-05 | 2018-10-16 | Nvidia Corporation | System, method, and computer program product for rendering at variable sampling rates using projective geometric distortion |
-
2018
- 2018-12-13 US US16/219,820 patent/US20200193685A1/en not_active Abandoned
-
2019
- 2019-11-05 EP EP19894723.6A patent/EP3895133A1/en not_active Withdrawn
- 2019-11-05 JP JP2021527088A patent/JP2022510804A/ja active Pending
- 2019-11-05 KR KR1020217016766A patent/KR20210092231A/ko unknown
- 2019-11-05 WO PCT/US2019/059944 patent/WO2020123060A1/en unknown
- 2019-11-05 CN CN201980081641.5A patent/CN113168728A/zh active Pending
Also Published As
Publication number | Publication date |
---|---|
EP3895133A1 (en) | 2021-10-20 |
KR20210092231A (ko) | 2021-07-23 |
WO2020123060A1 (en) | 2020-06-18 |
US20200193685A1 (en) | 2020-06-18 |
CN113168728A (zh) | 2021-07-23 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP2022510804A (ja) | 倍精度を用いない隙間のないレイと三角形との交差 | |
JP7421585B2 (ja) | 光線バンドルの光線に対する差分データを決定する方法及びグラフィックス処理ユニット | |
US11393157B2 (en) | Robust ray-triangle in intersection | |
US11238640B2 (en) | Early culling for ray tracing | |
US11790593B2 (en) | Ray-tracing multi-sample anti-aliasing | |
US11321903B2 (en) | Bounding volume hierarchy compression | |
US10706609B1 (en) | Efficient data path for ray triangle intersection | |
US20240087223A1 (en) | Overlay trees for ray tracing | |
US11521308B2 (en) | Ambient occlusion using bounding volume hierarchy bounding box tests | |
JP2022510805A (ja) | レイトレーシングにおけるトライアングル及びボックスの交差テストのための統合されたデータパス | |
US11954788B2 (en) | Variable width bounding volume hierarchy nodes | |
US20230097562A1 (en) | Acceleration structures with delta instances | |
CN116547716A (zh) | 包围体层次结构生成 | |
US20230206541A1 (en) | Common circuitry for triangle intersection and instance transformation for ray tracing | |
US20240203034A1 (en) | Box splitting for bounding volume hierarchies | |
US11450058B2 (en) | Early termination of bounding volume hierarchy traversal | |
US20240221284A1 (en) | Technique for testing ray for intersection with oriented bounding boxes | |
US20220189096A1 (en) | Opacity texture-driven triangle splitting | |
US20240221283A1 (en) | Emulating oriented bounding boxes in bounding volume hierarchies | |
US20240203033A1 (en) | Intersectable instance nodes for ray tracing acceleration structure nodes | |
US20230099806A1 (en) | Bounding volume hierarchy having oriented bounding boxes with quantized rotations | |
US20240144581A1 (en) | Variable bit morton codes |