SlideShare une entreprise Scribd logo
1  sur  42
Télécharger pour lire hors ligne
実践! QBVH
2013/8/24 レイトレ合宿
林 秀一
(http://d.hatena.ne.jp/shuichi_h)
※スライドの一部の図について
•以下の画像はwikipediaから借用しており、
ライセンスはwikipediaの表記に従います。
http://en.wikipedia.org/wiki/Bounding_volume_hierarchy
http://en.wikipedia.org/wiki/K-d_tree http://en.wikipedia.org/wiki/Octree
アジェンダ
1. 空間構造とは
2. なぜ必要?
3. さまざまな空間構造
4. 人気の空間構造
5. 空間構造の対価
6. よい空間構造とは
7. AABB
8. BVH
1. 構造
2. 構築
3. AABBとRayの交差判定
4. トラバースの流れ
9. QBVH
1. 特長
2. 構造
3. データ構造
4. 構築
5. 交差判定
6. トラバース早期打ち切り
10. 参考文献
空間構造とは
•空間を何らかのルールで区切った構造
•空間中のデータを高速に探索するために使
用される事が多い
なぜ必要?
•単純にレイトレを作ると プリミティブの数
レイの数 の交差判定が必要
•プリミティブやレイの数が増えるとすぐに非現
実的な処理時間になる
➡空間構造を使えば...
•交差判定処理の大部分を省ける
•計算量の増加がlogオーダーに抑えられる
なぜ必要?
•レイが当たった領域の中にある三角形だけ判定
すればよい
空間構造あり空間構造なし
空間構造の対価
•空間構造を格納するメモリ
•構築時間
•動的なシーンでは、更新も必要、
部分的に再構築する等の最適化も必要
よい空間構造とは
•交差判定が高速
•構築が高速
•メモリ使用量が少ない
•インコヒーレントなレイに対しても有効
(バラバラの方向からのレイにも有効)
さまざまな空間構造
Uniform Grid Octree
kd-tree BVH 等々...
Uniform Grid Octree
人気の空間構造
kd-tree BVH
レイトレでは、kd-tree と BVH が人気
AABB
•Axis-Aligned Bounding Box
•XYZ軸に平行なバウンディングボックス
•BVHで使用
BVH
Bounding Volume Hierarchy
BVH:構造
• 外側のAABBの中に、2つのAABBを含む
BVH:構造
•2分木になる
•葉はプリミティブ
•各ノードが自身のAABBを持つ
BVH:構造
•AABBは重なっていることもある
•あるノードの配下にあるオブジェクトはすべて、
そのノードのAABBに収まる
•空間的に収まっていても、そのノード配下とは限らない
BVH: 構築
よりよい方法はototoiさんのセミナーで!
方法1
中央の位置で分割
方法2
同数になるように分割
AABBとRayの交差判定
➡レイとBBoxが交わる範囲があるか否か判定する
Ray
AABB
•交差する位置座標を求める必要はない
•交差しているか、していないかだけ分かればOK
e
d
xmin
AABBとRayの交差判定
e …レイの始点
d …レイの方向
Ray
レイとAABBの交点を求める
AABBとRayの交差判定
txmin = (xmin - xe) / xd
レイdをtxmin倍すると xminと交わる
txmin倍
txmin
e
d
xmin
Ray
xd
xmin - xd
AABBとRayの交差判定
tymin
tymax
txmin
txmax
t [tymin, tymax]
t [txmin, txmax]
t [txmin, txmax] [tymin, tymax]
縦横で交わるtの範囲を求めて
tymax>txminか判定する
※縦横両方tというパラメータ空間の値なので比較できる
tymaxtxmin
AABBとRayの交差判定
レイの方向や、ゼロ除算によって出てくる+ , - ,を
考慮しても、最終的にシンプルなロジックになる。
詳細はRealistic Ray Tracing等を参照。
AABBとRayの交差判定
bool BBox::RayIntersect(const Ray &r, float tmin, float tmax)
{
// X軸
int sign = r.sign[0];
float t0 = (bb[sign].x - r.o.x) / r.dir.x;
float t1 = (bb[1-sign].x - r.o.x) / r.dir.x;
if (t0 > tmin) tmin = t0;
if (t1 < tmax) tmax = t1;
if (tmin > tmax) return false;
// Y軸
...
// Z軸
...
return true;
}
※もちろん割り算は予め1.f / r.dirを計算してRayに保存しておき、それとの掛け算にした方がいい
AABBとRayの交差判定
bool BBox::RayIntersect(const Ray &r, float tmin, float tmax)
{
// X軸
int sign = r.sign[0];
float t0 = (bb[sign].x - r.o.x) / r.dir.x;
float t1 = (bb[1-sign].x - r.o.x) / r.dir.x;
if (t0 > tmin) tmin = t0;
if (t1 < tmax) tmax = t1;
if (tmin > tmax) return false;
// Y軸
sign = r.sign[1];
t0 = (bb[sign].y - r.o.y) / r.dir.x;
t1 = (bb[1-sign].y - r.o.y) / r.dir.y;
if (t0 > tmin) tmin = t0;
if (t1 < tmax) tmax = t1;
if (tmin > tmax) return false;
// Z軸
sign = r.sign[2];
t0 = (bb[sign].z - r.o.z) / r.dir.z;
t1 = (bb[1-sign].z - r.o.z) / r.dir.z;
if (t0 > tmin) tmin = t0;
if (t1 < tmax) tmax = t1;
if (tmin > tmax) return false;
return true;
} ※もちろん割り算は予め1.f / r.dirを計算してRayに保存しておき、それとの掛け算にした方がいい
トラバースの流れ
1.RayとノードのBBoxを交差判定
(1)ヒットした場合
1)ノードが枝:
2つの子ノードをそれぞれ交差判定(再帰処理)
2)ノードが葉:
 交点の位置、色、法線等、必要な情報を格納
(2)ヒットしなかった場合
 何もせずreturn
QBVH: 特長
•SIMD命令を効果的に使用
•Binary BVH比 1.6∼2.0倍 高速
•kd-tree比 1.3∼1.6倍 高速
•メモリは10%∼50%削減
•インコヒーレントなレイに対しても有効
(※以上は、下記論文での主張です。)
H. Dammertz and J. Hanika1 and A. Keller: Shallow Bounding Volume Hierarchies for Fast
SIMD Ray Tracing of Incoherent Rays.
http://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.100/institut/Papers/QBVH.pdf
インコヒーレントなレイにも有効
•SIMDを使う別の手法:「レイパケット」の場合...
‣複数のレイをまとめてSIMDで交差判定
‣インコヒーレントなレイだとSIMDが有効に活用されず
➡一方でQBVHは、常にSIMDを有効活用する
QBVH:構造
•4つ(Quad)の子ノードを持つ
•子ノードのAABBは親のノードが持つ
•4つの子ノードのAABBをSIMDでまとめて
交差判定
Binary BVH Quad BVH
QBVH:構造
•ツリーが浅くなる
➡トラバース速そう
0
1
2
3
4
0
1
QBVH: データ構造
child0 child1 child2 child3
__m128
__m128
__m128
__m128
__m128
__m128
min x min x min x min x
min y min y min y min y
min z min z min z min z
max x max x max x max x
max y max y max y max y
max z max z max z max z
child0 idx child1 idx child2 idx child3 idx
axis top axis left axis right fill
1ノードあたり sizeof(float) * 8 * 4 = 128
QBVH: データ構造
child0 child1 child2 child3
__m128
__m128
__m128
__m128
__m128
__m128
min x min x min x min x
min y min y min y min y
min z min z min z min z
max x max x max x max x
max y max y max y max y
max z max z max z max z
child0 idx child1 idx child2 idx child3 idx
axis top axis left axis right fill
min/max xyz …子ノードのAABB
child idx …子ノードのインデックス
axis …分割軸 0:x 1:y 2:z
QBVH: データ構造
child0 child1 child2 child3
__m128
__m128
__m128
__m128
__m128
__m128
min x min x min x min x
min y min y min y min y
min z min z min z min z
max x max x max x max x
max y max y max y max y
max z max z max z max z
child0 idx child1 idx child2 idx child3 idx
axis top axis left axis right fill
SIMD処理できるように
SoA(Structure of Array)レイアウト
QBVH: データ構造
axis left
axis right
axis top
QBVH: 子ノードのindex
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
child idx:
32bit
空ならINT_MIN
QBVH: 子ノードのindex
枝or葉(1bit)
枝or葉のindex(31bit)
△ △ △ △ △ △ NULL △ △ △ △ △ NULL
先頭のインデックスを指す
葉のデータの配列:
child idx:
やり方 その1
QBVH: 子ノードのindex
枝or葉(1bit)
枝or葉のindex(31bit)
△ △ △ △ △ △ △ △ △ △ △ △ △
先頭のインデックスを指す
葉のデータの配列:
child idx:
やり方 その2
子の数(4bit)
QBVH: 子ノードのindex
枝or葉(1bit)
枝or葉のindex(31bit)
△ △ △ △ △ △ △ △ △ △ △ △ △
葉のデータの配列:
child idx:
やり方 その3
葉の数
葉のindex
その他情報
葉の数
葉のindex
その他情報
葉の数
葉のindex
その他情報
QBVH: 構築
•区切った領域をもう一段階、区切るだけ
•Binary BVHと同じ要領でOK
0
QBVH: 交差判定
•4つの子ノードのAABBをSIMDでまとめて
交差判定
•次項ソースコード参照
inline int SIMD_QBVH::IntersectSIMD(
const __m128 bboxes[2][3], // min-max[2] of xyz[3] of boxes[4]
const __m128 orig[3], // ray origin, xyz[3]
const __m128 idir[3], // ray inverse direction, xyz[3]
const int sign[3], // ray xyz direction -> +:0,-:1
__m128 tmin, __m128 tmax // ray range tmin-tmax
) const
{
// x coordinate
tmin = _mm_max_ps(
tmin, _mm_mul_ps(_mm_sub_ps(bboxes[sign[0]][0], orig[0]), idir[0])
);
tmax = _mm_min_ps(
tmax, _mm_mul_ps(_mm_sub_ps(bboxes[1 - sign[0]][0], orig[0]), idir[0])
);
// y coordinate
tmin = _mm_max_ps(
tmin, _mm_mul_ps(_mm_sub_ps(bboxes[sign[1]][1], orig[1]), idir[1])
);
tmax = _mm_min_ps(
tmax, _mm_mul_ps(_mm_sub_ps(bboxes[1 - sign[1]][1], orig[1]), idir[1])
);
// z coordinate
tmin = _mm_max_ps(
tmin, _mm_mul_ps(_mm_sub_ps(bboxes[sign[2]][2], orig[2]), idir[2])
);
tmax = _mm_min_ps(
tmax, _mm_mul_ps(_mm_sub_ps(bboxes[1 - sign[2]][2], orig[2]), idir[2])
);
return _mm_movemask_ps(_mm_cmpge_ps(tmax, tmin));//tmin<tmaxとなれば交差
}
QBVH: トラバース早期打ち切り
(1)
(2)
(3)
(4)
•レイのxyzの符号と分割軸の方向から、
交差判定する順番にノードをソート
•もし葉(三角形)に当たったら、次のノード
以降の交差判定を省略
参考文献
H. Dammertz and J. Hanika1 and A. Keller: Shallow Bounding Volume
Hierarchies for Fast SIMD Ray Tracing of Incoherent Rays.
http://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.100/institut/Papers/QBVH.pdf
QBVHの論文です。
ototoi: QBVHを実装した - 明日ではないから
http://d.hatena.ne.jp/ototoi/20090925/p1
QBVHについての解説、他の空間構造とのパフォーマンス比較結果、ソースコードがあります。
Shirley P.: Realistic Ray Tracing, Second Edition. AK Peters, Ltd., 2000.
http://www.amazon.com/dp/1568814615
BVHのソースコード、AABB-Ray交差判定の詳しい説明が載っています。
Kayvon F.: CMU 15-869, Graphics and Imaging Architectures.
http://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15869-f11/www/
Carnegie Mellon Universityのグラフィックスコースの資料。
Real-time ray tracingというリンクのPDFにレイパケットの説明があります。
ありがとうございました

Contenu connexe

Tendances

浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
Takeshi Yamamuro
 

Tendances (20)

Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
Swin Transformer (ICCV'21 Best Paper) を完璧に理解する資料
 
いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門いまさら聞けない!CUDA高速化入門
いまさら聞けない!CUDA高速化入門
 
なぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリングなぜなにリアルタイムレンダリング
なぜなにリアルタイムレンダリング
 
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
浮動小数点(IEEE754)を圧縮したい@dsirnlp#4
 
Unicode文字列処理
Unicode文字列処理Unicode文字列処理
Unicode文字列処理
 
中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~中級グラフィックス入門~シャドウマッピング総まとめ~
中級グラフィックス入門~シャドウマッピング総まとめ~
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
CUDAのアセンブリ言語基礎のまとめ PTXとSASSの概説
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
 
Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門Halide による画像処理プログラミング入門
Halide による画像処理プログラミング入門
 
【DL輪読会】Scale Efficiently: Insights from Pre-training and Fine-tuning Transfor...
【DL輪読会】Scale Efficiently: Insights from Pre-training and Fine-tuning Transfor...【DL輪読会】Scale Efficiently: Insights from Pre-training and Fine-tuning Transfor...
【DL輪読会】Scale Efficiently: Insights from Pre-training and Fine-tuning Transfor...
 
Sift特徴量について
Sift特徴量についてSift特徴量について
Sift特徴量について
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
KiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアルKiCadで雑に基板を作る チュートリアル
KiCadで雑に基板を作る チュートリアル
 
BRDF レンダリングの方程式
BRDF レンダリングの方程式BRDF レンダリングの方程式
BRDF レンダリングの方程式
 
近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer近年のHierarchical Vision Transformer
近年のHierarchical Vision Transformer
 
双方向パストレーシングレンダラedubpt解説
双方向パストレーシングレンダラedubpt解説双方向パストレーシングレンダラedubpt解説
双方向パストレーシングレンダラedubpt解説
 
ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争ディープラーニングのフレームワークと特許戦争
ディープラーニングのフレームワークと特許戦争
 
画像処理の高性能計算
画像処理の高性能計算画像処理の高性能計算
画像処理の高性能計算
 

Similaire à 実践QBVH

研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
Takeshi Yamamuro
 
Ibisml2011 06-20
Ibisml2011 06-20Ibisml2011 06-20
Ibisml2011 06-20
Yasuo Tabei
 
Introduction to Modern Analytical DB
Introduction to Modern Analytical DBIntroduction to Modern Analytical DB
Introduction to Modern Analytical DB
Takeshi Yamamuro
 
Logをs3とredshiftに格納する仕組み
Logをs3とredshiftに格納する仕組みLogをs3とredshiftに格納する仕組み
Logをs3とredshiftに格納する仕組み
Ken Morishita
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
MITSUNARI Shigeo
 
0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)
MasanoriSuganuma
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介
Ohsawa Goodfellow
 

Similaire à 実践QBVH (20)

衝突判定
衝突判定衝突判定
衝突判定
 
研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
 
Ibisml2011 06-20
Ibisml2011 06-20Ibisml2011 06-20
Ibisml2011 06-20
 
20180427 arXivtimes 勉強会: Cascade R-CNN: Delving into High Quality Object Det...
20180427 arXivtimes 勉強会:  Cascade R-CNN: Delving into High Quality Object Det...20180427 arXivtimes 勉強会:  Cascade R-CNN: Delving into High Quality Object Det...
20180427 arXivtimes 勉強会: Cascade R-CNN: Delving into High Quality Object Det...
 
K-means hashing (CVPR'13) とハッシング周り
K-means hashing (CVPR'13) とハッシング周りK-means hashing (CVPR'13) とハッシング周り
K-means hashing (CVPR'13) とハッシング周り
 
Introduction to Modern Analytical DB
Introduction to Modern Analytical DBIntroduction to Modern Analytical DB
Introduction to Modern Analytical DB
 
データベースシステム論11 - データベースの構成
データベースシステム論11 - データベースの構成データベースシステム論11 - データベースの構成
データベースシステム論11 - データベースの構成
 
Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)Hello Dark-Side C# (Part. 1)
Hello Dark-Side C# (Part. 1)
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法WALをバックアップとレプリケーションに使う方法
WALをバックアップとレプリケーションに使う方法
 
実行時のデータ型の表現手法
実行時のデータ型の表現手法実行時のデータ型の表現手法
実行時のデータ型の表現手法
 
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
【ウェブ セミナー】AI 時代のクラウド データ ウェアハウス Azure SQL Data Warehouse [実践編]
 
Logをs3とredshiftに格納する仕組み
Logをs3とredshiftに格納する仕組みLogをs3とredshiftに格納する仕組み
Logをs3とredshiftに格納する仕組み
 
Serializabilityとは何か
Serializabilityとは何かSerializabilityとは何か
Serializabilityとは何か
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)0から理解するニューラルネットアーキテクチャサーチ(NAS)
0から理解するニューラルネットアーキテクチャサーチ(NAS)
 
Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)Proposed boost b_tree_library(ja)
Proposed boost b_tree_library(ja)
 
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
DBP-009_クラウドで実現するスケーラブルなデータ ウェアハウス Azure SQL Data Warehouse 解説
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
XLWrapについてのご紹介
XLWrapについてのご紹介XLWrapについてのご紹介
XLWrapについてのご紹介
 

Dernier

Dernier (7)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

実践QBVH