Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
双方向パストレーシング(BDPT)の基礎からOpenCLによる実装まで
Introduction to Bidirectional Path Tracing & its implementation using
OpenCL
追加資料 (CED...
BDPT Note@CEDEC2015 2
という二つの方法がある。1 については GPU などを用いて高速化することができる。本セッションでは 2 について取り
上げ、パストレーシングよりも賢いアルゴリズムである BDPT について説明する。...
BDPT Note@CEDEC2015 3
図 2: 様々な表面。
1 f o r ( i n t i =0; i<nx ; i++) f o r ( i n t j =0; j<ny ; j++)
2 {
3 Ray ray = genPri...
BDPT Note@CEDEC2015 4
図 3: サンプリング方法の比較。
14 i f ( ! hit1 . hasHit () )
15 {
16 output+=c o e f f ∗ getEmission ( hit1 ) / p...
BDPT Note@CEDEC2015 5
図 4: 様々な表面でのサンプリング方法の比較。
図 5: マルチプルインポータンスサンプリングの可視化。
1.6 Implementation #4 (Multiple Importance Sam...
BDPT Note@CEDEC2015 6
(a) (b) (c)
図 6: パストレーシングを用いて同じ条件下でレンダリングした画像の例。
図 7: パストレーシングを用いてレンダリングした画像の例。
25 output += c o e f...
BDPT Note@CEDEC2015 7
図 8: パストレーシングと BDPT との比較。
(a) (b)
図 9: パストレーシングとライトトレーシング。
節光の計算は光の経路が複数回反射してやっと有効な経路になるため、そのような経路を生...
BDPT Note@CEDEC2015 8
図 10: パストレーシングの拡張。
図 11: パストレーシングと Fig. 10 のアルゴリズムとの比較。
Fig. 12 ではこれらの 2 つテクニックだけでなく、それ以外にも複数のテクニックを...
BDPT Note@CEDEC2015 9
(a) (b)
(c) (d)
(e) (f)
図 12: カメラとライトの双方向から光の経路を構築し、それらの経路を途中でつなぎ合わせてできる有効な経路。
BDPT Note@CEDEC2015 10
4 Bidirectional Path Tracing Implementations for GPUs
双方向パストレーシング (BDPT) でマルチプルインポータンスサンプリングを行うには、基...
BDPT Note@CEDEC2015 11
であり光源の放射モデルに依存する.また, −→p −1 はカメラレンズ上の 1 点をサンプルする確率:
−→p −1 = P(x0), (7)
であり, ←−p k+1 は光源上の 1 点をサンプル...
BDPT Note@CEDEC2015 12
となるため,
−→p v =
1
AV
=
1
4 · l2 · tan
(θh
2
)
· tan
(θv
2
), (13)
が得られる.これを式 11 に代入して:
P⊥(x0 → x1) =...
BDPT Note@CEDEC2015 13
Algorithm LCV-BDPT 1: Light Vertex Cache BDPT
// Preparation phase
pathLength = 0;
foreach path in ...
BDPT Note@CEDEC2015 14
から,式 16 の 1 項目は:
Pi(X)
Ps(X)
=
Pi(X)
Pi+1
Pi+1(X)
Pi+2(X)
· · ·
Ps−1(X)
Ps(X)
=
←−p i+2
−→p i
·
←−p...
BDPT Note@CEDEC2015 15
Implementation LVC-BDPT 2: Light Vertex Cache BDPT implementation outline
// Light ray tracing
maxD...
BDPT Note@CEDEC2015 16
implicit view path 戦略で経路 X をサンプルする場合の pdf pVI (X) は
pVI
(X) =
k−1∏
i=−1
−→p i, (24)
explicit light ...
BDPT Note@CEDEC2015 17
explicit light path の重みの逆数は:
1
wLE
(X)
=
pVE (X)β
+ pVI (X)β
+ pLE (X)β
+ pLI (X)β
pLE
(X)β
= 1 +
p...
BDPT Note@CEDEC2015 18
ライトトレース時は:
s0 =
1
P(x−1 → x0 → x1)G(x0 ↔ x1)
s1 =
1
P(x0 → x1 → x2)
si =
P(xi−1 ← xi ← xi+1)
P(xi−1...
BDPT Note@CEDEC2015 19
おわりに
今回はじめて CEDEC の講演の追加資料をまとめてみました。どうでしたか。コメントやアドバイス等ありましたら、
takahiroharada at gmail dot com までお願い...
Prochain SlideShare
Chargement dans…5
×

Introduction to Bidirectional Path Tracing (BDPT) & Implementation using OpenCL追加資料 (CEDEC 2015)

2 751 vues

Publié le

Additional note (in Japanese) for the CEDEC 2015 presentation.

Publié dans : Technologie
  • DOWNLOAD THIS BOOKS INTO AVAILABLE FORMAT (Unlimited) ......................................................................................................................... ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download Full EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ACCESS WEBSITE for All Ebooks ......................................................................................................................... Download Full PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... Download doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici

Introduction to Bidirectional Path Tracing (BDPT) & Implementation using OpenCL追加資料 (CEDEC 2015)

  1. 1. 双方向パストレーシング(BDPT)の基礎からOpenCLによる実装まで Introduction to Bidirectional Path Tracing & its implementation using OpenCL 追加資料 (CEDEC2015) Takahiro Harada, Sho Ikeda, Syoyo Fujita 2015/08/30 概 要 パストレーシングはレンダリング方程式を解く一つの方法であり、モンテカルロ積分を用いたレイとレーシングであ るのでモンテカルロレイトレーシングとも言う。パストレーシングを数式を用いて説明すると簡単に説明できるが、初学 者にとっては理解しがたく、直感的な理解が難しい。本文章では前半はパストレーシングを感覚的に理解できるように説 明し、実装の助けになるように疑似コードを交えて説明していく。そしてパストレーシングが得意なシーンと不得意な シーンの説明を行い、不得意なシーンをより効率的にレンダリングできるようにパストレーシングに簡単な拡張した方 法を説明する。そしてその拡張の一般化した形である双方向パストレーシング (Bidirectional Path Tracing, BDPT) に ついて説明する。本文章の後半では BDPT を OpenCL で実装する際のチャレンジについて説明し、OpenCL の実装に 適した二つの手法、Instant BDPT と Lvc BDPT について説明する。 1 Path Tracing 1.1 Introduction パストレーシングを用いると図 1 に示すような高品質なレンダリングを行うことができる。パストレーシングではラ スターグラフィックスが不得意とするグローバルイルミネーション (大域照明) を正しく計算することができる。パスト レーシングはプログレッシブな計算方法であり、複数回同じカメラからフレームバッファのレンダリングを行い、複数 のフレームバッファの平均を取ることで最終的なレンダリング結果を求める。パストレーシングを用いて美しいグロー バルイルミネーションの計算を行うのは計算負荷が高く、ラスターグラフィックスと比べると長い計算がかかる。 長い計算時間を短くするためには、 • 1 フレームのレンダリングの時間を短縮する • 1 フレームのレンダリングのノイズを減らす (a) (b) 図 1: パストレーシングを用いてレンダリングした画像の例。 1
  2. 2. BDPT Note@CEDEC2015 2 という二つの方法がある。1 については GPU などを用いて高速化することができる。本セッションでは 2 について取り 上げ、パストレーシングよりも賢いアルゴリズムである BDPT について説明する。 BDPT の説明に移る前に、その基礎となるパストレーシングのアルゴリズム、インポータンスサンプリング (Importance sampling)、マルチプルインポータンスサンプリング (Multiple importance sampling, MIS) について説明する。 1.2 Implementation #1 レンダリング方程式の説明は省略するが、パストレーシングの 1 フレーム (ステップ) の計算は List. 1 に示すように 実装できる。このコードではそれぞれのピクセル (i, j) に対して、ループを回し、まずカメラからのレイであるプライマ リーレイを生成する。そしてそのレイとシーンとの交差を求める。レイが何にもヒットしていなければ次のピクセルの 処理に移り、ヒットしたものが発光している表面ならば、ピクセルにその色を書き込む (これを経路を有効なパスが見つ かったという。)。発光していない表面ならば、次のレイを生成する。ここでは randomSample() という関数でランダム な方向を全球上から求め、レイを生成する。そして行 7 に戻り、そのレイとシーンとの交差を求める処理からの処理を 最大のレイの深さ (maxDepth) になるまで繰り返す。 1 f o r ( i n t i =0; i<nx ; i++) f o r ( i n t j =0; j<ny ; j++) 2 { 3 Ray ray = genPrimaryRay ( i , j ) ; 4 5 f l o a t 4 c o e f f = 1. f ; 6 f l o a t 4& output = p i x e l [ i , j ] ; 7 f o r ( i n t depth =0; depth<maxDepth ; depth++) 8 { 9 Hit h i t = i n t e r s e c t ( ray ) ; 10 i f ( ! h i t . hasHit () ) break ; 11 12 i f ( h i t . isEmissive () ) 13 {// I m p l i c i t Connection 14 output += c o e f f ∗ getEmission ( h i t ) ; 15 break ; 16 } 17 18 ray , f , pdf = randomSample ( h i t ) ; 19 c o e f f ∗= f ∗ dot ( h i t . m n , ray . m dir ) / pdf ; 20 } 21 } Listing 1: パストレーシング実装 #1 この実装は簡単であるが、効率が悪くノイズがなかなか消えない。つまり 1 フレームのレンダリングで得られる結果 がノイジーである。これは主に List. 1 行 18 の randomSample() が原因である。randomSample() は全球上からランダ ムに方向を求めた。しかし光を透過しない表面ではレイが入射した側と反対側には光は届かない。したがってレイが入 射した側の半球上からランダムに次のレイの方向を求めれば改善できる。 この実装を用いて様々な種類の BRDF を含むシーンをレンダリングすると、ある表面上はノイズがなかなか消えない ことに気づく。マットな表面上ではそこそこ早くノイズが消えるが、光沢がある表面上ではノイズがなかなか消えない。 これは光沢がある表面での反射特性によるものである。様々な BRDF の反射特性が知られており、それを用いて次のレイ の方向を求めると光沢のある表面でもより効率的にレンダリングができるようになる。Fig. 2 に様々な表面の例を示す。 1.3 Implementation #2 (BRDF Importance Sampling) 鏡面反射のような表面では半球上からランダムに方向を決めて次のレイの方向を求める方法では、有効な反射方向を 求めることが難しい。しかし鏡面反射する表面ではレイが反射する方向が入射方向に対して一意に決まる。よって鏡面 反射する表面ではその方向のみにレイを飛ばせばよい。 光沢のある表面は、鏡面反射する表面とマットな表面の間のような特性があり、反射する方向は、鏡面反射方向の周 りにコーンを作り、その中の方向に強く反射する。よってそのコーンの中からランダムな方向を求めれば効果的なレイ の方向を求めることができる。このように BRDF の性質を用いて反射するレイの方向を求めることを BRDF を用いた インポータンスサンプリングと呼ぶ (BRDF の分布を考慮したインポータンスサンプリング)。 疑似コードを List. 1 に示すが List. 2 との違いは行 18 だけであり、List. 2 では randomSample() の代わりに brdfSample() を用いている。
  3. 3. BDPT Note@CEDEC2015 3 図 2: 様々な表面。 1 f o r ( i n t i =0; i<nx ; i++) f o r ( i n t j =0; j<ny ; j++) 2 { 3 Ray ray = genPrimaryRay ( i , j ) ; 4 5 f l o a t 4 c o e f f = 1. f ; 6 f l o a t 4& output = p i x e l [ i , j ] ; 7 f o r ( i n t depth =0; depth<maxDepth ; depth++) 8 { 9 Hit h i t = i n t e r s e c t ( ray ) ; 10 i f ( ! h i t . hasHit () ) break ; 11 12 i f ( h i t . isEmissive () ) 13 {// I m p l i c i t Connection 14 output += c o e f f ∗ getEmission ( h i t ) ; 15 break ; 16 } 17 18 ray , f , pdf = brdfSample ( h i t ) ; 19 c o e f f ∗= f ∗ dot ( h i t . m n , ray . m dir ) / pdf ; 20 } 21 } Listing 2: パストレーシング実装 #2 1.4 Implementation #3 (Light Importance Sampling) この実装を用いて様々なシーンをレンダリングすると、マットな表面やそれに近い鈍い光沢のある表面を小さな光源で 照らしたときにノイズが長く残ることに気づく。この原因はマットな表面で半球上にランダムにレイを飛ばすと、レイ はほとんどライトに当たらないからである。このような場合はランダムにレイを飛ばすより、ライトの形状がわかって いるので、そのライトの方向に重点的にレイを飛ばしたほうが効率良くレンダリングを行うことができる。このような レイのサンプリング方法をライトを用いたインポータンスサンプリングという (ライトの分布を考慮したインポータンス サンプリング)。 Fig. 3 にあるシーンを Sec. 1.3 で説明した BRDF を用いたインポータンスサンプリングを用いてレンダリングした結 果と、ライトを用いたインポータンスサンプリングを用いてレンダリングした結果の比較を示す。16spp を用いてレンダ リングした結果を見ると後者の方がマットな表面でのノイズが少ないことがわかる。 List. 3 にライトを用いたインポータンスサンプリングを行う疑似コードを示す。 1 f o r ( i n t i =0; i<nx ; i++) f o r ( i n t j =0; j<ny ; j++) 2 { 3 Ray ray = genPrimaryRay ( i , j ) ; 4 5 f l o a t 4 c o e f f = 1. f ; 6 f l o a t 4& output = p i x e l [ i , j ] ; 7 f o r ( i n t depth =0; depth<maxDepth ; depth++) 8 { 9 Hit h i t = i n t e r s e c t ( ray ) ; 10 i f ( ! h i t . hasHit () ) break ; 11 {// E x p l i c i t Connection 12 ray , pdf = lightSample ( h i t ) ; 13 Hit hit1 = i n t e r s e c t ( ray ) ;
  4. 4. BDPT Note@CEDEC2015 4 図 3: サンプリング方法の比較。 14 i f ( ! hit1 . hasHit () ) 15 { 16 output+=c o e f f ∗ getEmission ( hit1 ) / pdf ; 17 } 18 } 19 ray , f , pdf = brdfSample ( h i t ) ; 20 c o e f f ∗= f ∗ dot ( h i t . m n , ray . m dir ) / pdf ; 21 } 22 } Listing 3: パストレーシング実装 #3 List. 2 と List. 3 の二つの疑似コードを見比べると、List. 2 で有効な経路を作成していた行 18 が List. 3 のコードに はないことがわかる。この行を List. 3 に追加してしまうと、レンダリング結果画像のピクセルの色が 2 倍になってしま う。これはそれぞれのコードが有効な光の経路を違った方法で見つけているだけであるためである。List. 2 と List. 3 を 長い時間計算すると同じ画像が得られる。つまりこれは List. 2 で見つけた光の経路を List. 3 でも見つけられていると いうことに他ならない。 しかしせっかく List. 2 で見つけている有効な光の経路を List. 3 では無視している。これは直感的に無駄なように思 え、実際無駄である。それでは両方のテクニックで見つけた光の経路を有効に活用するにはどうすれば良いだろうか。 1.5 Multiple Importance Sampling 先ほど両方のテクニックでレンダリング結果は Fig. 3 に示すように最終的に同じになり、両方の結果を足し合わせる とピクセルの色が 2 倍になってしまうと述べた。それでは単純に両方の結果を足し合わせ、結果を 2 で割ってはどうだ ろうか。この方法を用いると両方のテクニックで見つけた有効な光の経路を活用することができる。しかし同じ数のサ ンプルを用いてレンダリングをした結果 (Fig. 3) を見るとライトを用いたインポータンスサンプリングの方が画像のノ イズが少ないように見える。よって単に平均を取るよりも、ライトを用いたインポータンスサンプリングの結果により 高い重みをつけて足し合わせた方が良さそうである。重みの比はどの値が最適なのであろうか。 2 つのテクニックを用いてレンダリングした結果をもう少し詳しく見てみると、重みをどのようにデザインすればいい かについて手がかりが得られる。Fig. 4 に光沢の鋭さを変えた物体をいくつか配置してレンダリングした結果を示す。こ の図を見ると光沢が鈍い表面ではライトを用いたインポータンスサンプリングの方がノイズが少なく、光沢が鋭い表面 では BRDF を用いたインポータンスサンプリングの方がノイズが少ないということがわかる。つまり、レンダリングし ている全領域でどちらのテクニックが優れているということはできず、表面の光沢の度合い、より一般化すると BRDF によってそれぞれのテクニックにおける収束の速度が違うということがわかる。 それでは Fig. 5 のように重みをピクセルごとに変えてみてはどうだろうか。そうすることで 2 つのテクニックを最適 に組み合わせることができそうである。ここで気をつけたいのは、ピクセルにおいて重みは一定ではないが、それぞれ のピクセルにおいて両方の重みの和を取ると 1 になるということである。このようにピクセルごとの重みを変えて結果 を足し合わせることをマルチプルインポータンスサンプリングと言う。
  5. 5. BDPT Note@CEDEC2015 5 図 4: 様々な表面でのサンプリング方法の比較。 図 5: マルチプルインポータンスサンプリングの可視化。 1.6 Implementation #4 (Multiple Importance Sampling) ではそれぞれのピクセルの重みをどのようにデザインすれば良いだろうか。これを理解するにはなぜ別のテクニック でレンダリングした結果が違ったものになるのかを理解することが必要になる。2 つのテクニックの違いは光の経路の最 後の線分を生成する方法が違うことに起因する。BRDF を用いたインポータンスサンプリングを用いると最後の線分は、 BRDF の反射特性を用いて反射するレイを生成する分布を作っているのに対し、ライトを用いたインポータンスサンプ リングを用いると、ライトの形状を用いて反射するレイを生成する分布を作っている(少し難しくなってきましたね)。 つまり 1 つの線分だけ見てみるとその線分が生成される信値 (Probability density function をわかりやすく言い換えた) が違い、それによって違う結果が得られているということである。一般的に言うと信値が高い方法で生成されたパスの 方がノイズが少ないことが多い。よってこのパスを生成する震度を用いて重みを決定する方法が一般的である。 マルチプルインポータンスサンプリングを用いたアルゴリズムを List. 4 に示す。行 15 と 24 においてそれぞれのテク ニックの重みを計算している。 1 f o r ( i n t i =0; i<nx ; i++) f o r ( i n t j =0; j<ny ; j++) 2 { 3 Ray ray = genPrimaryRay ( i , j ) ; 4 5 f l o a t 4 c o e f f = 1. f ; 6 f l o a t 4& output = p i x e l [ i , j ] ; 7 f l o a t pdfb = 0. f ; 8 f o r ( i n t depth =0; depth<maxDepth ; depth++) 9 { 10 Hit h i t = i n t e r s e c t ( ray ) ; 11 i f ( ! h i t . hasHit () ) break ; 12 i f ( h i t . isEmissive () ) 13 {// I m p l i c i t Connection 14 pd fl = lightPdf ( h i t ) ; 15 w = pdfb / ( pdfb + pdfl ) ; 16 output += c o e f f ∗ getEmission ( h i t ) ∗ w; 17 break ; 18 } 19 {// E x p l i c i t Connection 20 ray , pdfl = lightSample ( h i t ) ; 21 Hit hit1 = i n t e r s e c t ( ray ) ; 22 i f ( ! hit1 . hasHit () ) 23 { 24 w = pdfl / ( pdfb + pdfl ) ;
  6. 6. BDPT Note@CEDEC2015 6 (a) (b) (c) 図 6: パストレーシングを用いて同じ条件下でレンダリングした画像の例。 図 7: パストレーシングを用いてレンダリングした画像の例。 25 output += c o e f f ∗ getEmission ( hit1 ) ∗ w / pdfl ; 26 } 27 } 28 ray , f , pdfb = brdfSample ( h i t ) ; 29 c o e f f ∗= f ∗ dot ( h i t . m n , nextRay . m dir ) / pdfb ; 30 } 31 } Listing 4: パストレーシング実装 #4 2 Beyond Path Tracing 2.1 Path Tracing Good & Bad ここで Fig. 6 に示すパストレーシングを用いてレンダリングした結果を 3 つ示す。これらのレンダリング結果は実は 同じ数のサンプルを用いて計算されたものである。それにもかかわらずこれらを見比べるとノイズの強さが違うことに 気づくだろう。Fig. 6(a) は少なく、Fig. 6(b) はノイズが少し増え、Fig. 6(c) はとてもノイズが多い。Fig. 6 からパス トレーシングのシーンにおける得意、不得意がよく分かる。直接光からの寄与が大きい Fig. 6(a) のような Outdoor の シーンでは得意であるが、Fig. 6(c) のような Indoor のシーンは不得意であることがわかる。関節光がシーンの大半を照 らしている Fig. 6(c) は長く計算を行わなければ、ノイズが気にならないレベルまで落ちない。これは何故かというと関
  7. 7. BDPT Note@CEDEC2015 7 図 8: パストレーシングと BDPT との比較。 (a) (b) 図 9: パストレーシングとライトトレーシング。 節光の計算は光の経路が複数回反射してやっと有効な経路になるため、そのような経路を生成する信度が低いため、ノ イズが多い結果になっている (Fig. 7)。 パストレーシングではカメラ側から経路を作ってきたが、ライト側から経路を作っていくこともでき、このような関節 光による寄与が大きいシーンではライト側から経路を作っていった方が信度を高くすることができる。ライト側から経路 を構築していく方法をライトトレーシングと言い、ライトトレーシングではパストレーシングでは見つけることが困難 であった経路も容易に見つけることが可能なこともある (Fig. 9)。Fig. 8 にシーンをパストレーシングでレンダリングし た例と、BDPT(ライトトレーシングを内部で使っている) を使ってレンダリングした例を示す。パストレーシングでは プリズム間のコースティックスをレンダリングするのが困難であるが、BDPT ではそれが比較的容易であるのがわかる。 2.2 Tracing from Light それではパストレーシングを拡張して、少しライト方向からの経路の構築を混ぜてみることを考える。Fig. 10 に示す ようにまずパストレーシングのようにカメラから経路を構築していき、次にライトから 1 回レイキャストを行い、その 点とカメラから経路の端点を接続してみる。すると Fig. 11 に示す間接照明が支配的であるシーンでもパストレーシン グと比較して、ノイズが少ない結果が得られることがわかる。 今用いたテクニックはライト側から 1 回レイキャストを行い、経路をライトの方向から一区間構築したが、これを一 般化してライト側から複数区間の経路を構築することも可能である。そうすればパストレーシングや、今用いたパスト レーシングを拡張した手法でも苦手なシーンでも効果的にレンダリングを行うことが可能になる。そのような手法を双 方向パストレーシング (BDPT) と言う。 3 Bidirectional Path Tracing BDPT はカメラとライトの双方向から光の経路を構築し、それらの経路を途中でつなぎ合わせ、有効な経路を構築す る手法の名称である。一つのカメラからの経路とライトからの経路のペアを用いると Fig. 12 に示すように複数個の有 効な経路を構築することができる。これらの経路全てを足し合わせることも可能であるが、単に足し合わせてしまうと Sec. 1.6 で示したような結果画像が明るくなりすぎるという問題が発生する。例えば Fig. 12 の (a), (b) は Sec. 1.6 で示 した Camera Implicit Connection と Camera Explicit Connection に相当する。よってこれら 2 つを足し合わせると正し い結果画像の 2 倍の明るさの結果画像が得られた。結果画像を正しいものにするために、それぞれのテクニックで計算 した 2 つの結果のを足し合わせ 2 で割れば(画像の平均を求める)、最適ではないが正しい結果画像が求まると述べた。
  8. 8. BDPT Note@CEDEC2015 8 図 10: パストレーシングの拡張。 図 11: パストレーシングと Fig. 10 のアルゴリズムとの比較。 Fig. 12 ではこれらの 2 つテクニックだけでなく、それ以外にも複数のテクニックを用いて有効な経路を構築している。 それぞれのテクニックが Fig. 12(a), (b) と同様に正しい結果画像を求めることができるので n 個のテクニックを用いた 結果を足し合わせると結果画像が n 倍明るいものになってしまう。正しい画像にするためには、全てのテクニックで求 めた結果画像を足し合わせ、n で割ればとりあえず求めたい結果画像を求めることができる。 しかし単に画像の平均をとるのは Sec. 1.6 で述べた例と同様に、最適な重み付けではない。それはそれぞれのテクニッ クが得意とする光の経路があるため、最適な重み付けはテクニックの有効性を考慮してそれぞれのピクセルごとの重み を計算することである。これは Sec. 1.6 で示したマルチプルインポータンスサンプリングを拡張したものに他ならない。
  9. 9. BDPT Note@CEDEC2015 9 (a) (b) (c) (d) (e) (f) 図 12: カメラとライトの双方向から光の経路を構築し、それらの経路を途中でつなぎ合わせてできる有効な経路。
  10. 10. BDPT Note@CEDEC2015 10 4 Bidirectional Path Tracing Implementations for GPUs 双方向パストレーシング (BDPT) でマルチプルインポータンスサンプリングを行うには、基本的にカメラとライト両 方から構築した光の経路上の全ての頂点をキャッシュしておかなければならない。この実装は CPU 上で 1 ピクセルず つ処理する場合には問題にはならないが、GPU 上で複数のピクセルを同時に処理する場合は、同時に処理しているピ クセル数 × 頂点のデータ量をメモリに保持する必要があり、多量のメモリが必要となる。多くのメモリを必要としな い BDPT の実装がいくつか研究されており、その中でも我々は Light Vertex Cache BDPT [Davidoviˇc et al., 2014] と Instant BDPT [Bogolepov et al., 2013] を実装した。ここではそのアルゴリズムの実装の詳細について記述する。 4.1 Probability Density Function xi 1 xi xi+1 !n xi !n xi+1 !! xixi+1 図 13: 頂点 Multiple Importance Sampling (MIS) では光の経路構築時に,各頂点のサンプルに用いた確率密度関数 (pdf) を用い て経路の重みを計算する.重みの計算時には, pdf の測度を統一することに注意しなければならない.例として,物体 の表面の 1 点をサンプルする pdf は単位面積 [m−2 ] で与えられ,光の反射方向をサンプルする pdf は単位立体角 [st−1 ] で与えられる.これらの pdf は単位が異なるため直接足し合わせることはできず,どちらかの単位に揃える必要がある. MIS の計算では単位面積の pdf による計算がの方が簡単であるため,単位立体角の pdf から単位面積の pdf に変換す る方法を述べる. 点 xi から点 xi+1 への方向をサンプルする pdf を P(xi−1 → xi → xi+1) とする.点 xi から点 xi+1 をサンプルする pdf は: −→p i = P⊥(xi−1 → xi → xi+1)G(xi ↔ xi+1), (1) 点 xi から点 xi−1 をサンプルする pdf は: ←−p i = P⊥(xi−1 ← xi ← xi+1)G(xi−1 ↔ xi), (2) である.P⊥ は投影微小立体角に関する pdf であり: P⊥(xi−1 → xi → xi+1) = P(xi−1 → xi → xi+1) −→ω xixi+1 · −→n xi , (3) G(xi ↔ xi+1) は単位投影立体角と単位面積を変換する幾何項である. G(xi ↔ xi+1) = V (xi ↔ xi+1) −→ω xixi+1 · −→n xi −→ω xixi+1 · −→n xi+1 ∥xi+1 − xi∥2 , (4) V (xi ↔ xi+1) は可視関数である. 特殊なケースとして, P(x−1 → x0 → x1) は x0 → x1 方向をサンプルする確率: P(x−1 → x0 → x1) = P(x0 → x1), (5) でありカメラのレンズモデルに依存する.P(xk−1 ← xk ← xk+1) は xk−1 ← xk 方向をサンプルする確率: P(xk−1 ← xk ← xk+1) = P(xk−1 ← xk), (6)
  11. 11. BDPT Note@CEDEC2015 11 であり光源の放射モデルに依存する.また, −→p −1 はカメラレンズ上の 1 点をサンプルする確率: −→p −1 = P(x0), (7) であり, ←−p k+1 は光源上の 1 点をサンプルする確率: ←−p k+1 = P(xk), (8) である. 4.1.1 点 x0, x1 の pdf の導出 l x0 v x1d !! 1 !n 0 !n 1 L V ✓ 図 14: カメラモデル パストレーシングなどで光の経路 X = x0, · · · , xk をトレースする場合,点 x0 はカメラのレンズ上の 1 点がサンプル され,x1 はセンサーの応答関数 We(x0 → x1) に従ったサンプリング手法でサンプルされる. カメラ空間でカメラのレンズ L の中心が原点 c の位置あり,c から距離 l 離れた位置にイメージプレーン V がある とする.シーン中のサンプル点 x1 はイメージプレーン上の点 v をサンプルすることで決定する (図 14 参照). 最初の点 x0 は レンズ L の単位面積の pdf PA(x0) に従ってレンズ上からサンプルされる.理想的なピンホールカメ ラの場合,レンズは面積を持たないので,常に x0 = c となり PA(x0) = 1 となる.点 x1 はイメージプレーン V 上から 点 v をサンプルし,点 x0 から点 v へと向かうレイをトレースすることで発見する.点 x0 が決定したときに点 v がサ ンプルされる pdf −→p v は: −→p v = P⊥(x0 → v)G(x0 ↔ v), (9) 点 x1 がサンプルされる pdf −→p 0 は: −→p 0 = P⊥(x0 → x1)G(x0 ↔ x1), (10) 図 14 に示すように,P⊥(x0 → v) = P⊥(x0 → x1) から: P⊥(x0 → x1) = −→p v G(x0 ↔ v) , (11) また,点 v はイメージプレーン上から一様にサンプルされるため −→p v はイメージプレーンの面積の逆数となる.水平方 向の視野角が θh 垂直方向の視野角が θv のときイメージプレーンの面積は: AV = ( 2 · l · tan ( θh 2 )) ( 2 · l · tan ( θv 2 )) = 4 · l2 · tan ( θh 2 ) · tan ( θv 2 ) , (12)
  12. 12. BDPT Note@CEDEC2015 12 となるため, −→p v = 1 AV = 1 4 · l2 · tan (θh 2 ) · tan (θv 2 ), (13) が得られる.これを式 11 に代入して: P⊥(x0 → x1) = 1 G(x0 ↔ v) 1 4 · l2 · tan (θh 2 ) · tan (θv 2 ) = ∥v − x0∥ |−−→ωx0v · −→n x0 | |−−→ωx0v · −→n v| 1 4 · l2 · tan (θh 2 ) · tan (θv 2 ) = l2 cos2θ cos2θ 1 4 · l2 · tan (θh 2 ) · tan (θv 2 ) = 1 4 · cos4θ · tan (θh 2 ) · tan (θv 2 ) P(x0 → x1) = 1 4 · cos3θ · tan (θh 2 ) · tan (θv 2 ), (14) が得られる. 4.2 Light Vertex Cache Bidirectional Path Tracing 4.2.1 Algorithm Light Vertex Cache Bidirectional Path Tracing (LVC-BDPT) の特徴は光源側のサブパスの各頂点の情報を Light Vertex Cache と呼ばれるグローバルのキャッシュに保存することである. アルゴリズム 1 に LVC-BDPT のアルゴリズムを示す.LVC-BDPT は光源のサブパスの経路長を決定したり,Light Vertex Cache のメモリの確保をを行ったりする準備段階と,光源や視線からパスのトレースを行う段階とに分けられる. 準備段階ではまず,光源のサブパスの経路長を決定する.LVC-BDPT の元論文 [Davidoviˇc et al., 2014] では,最適な経 路長を推定するため 10 万本のパスを光源から追跡し,その平均経路長をサブパスの経路長としている.光源からのパス トレースの段階ではパスの頂点をキャッシュに保存していき,視線からのパストレースの段階で,キャッシュに保存した サブパスを一様な確率でランダムに選択し,選択したサブパスの角頂点と視線パスとを接続する. 4.2.2 Multiple Importance Sampling BDPT 法で効率良くレンダリングするためには MIS は欠かすことのできない要素であるが,通常 MIS の重みを計算 する場合はトレースする経路の全ての頂点の情報を記憶しておく必要がある.しかし,この方法は GPU でのレンダリン グでは効率的ではない.そこで, MIS のパワーヒューリスティック重みを再帰的に計算する手法 [Antwerpen, 2011] を 用いる.この手法ではカメラ側のサブパスの情報を記録する必要がないため,効率的に MIS の重みを計算できる.カメ ラのサブパス XE = x0, · · · , xs と光源のサブパス XL = xs+1, · · · , xk を接続して,経路 X = x0, · · · , xs, xs+1, · · · , xk を構築するときの MIS の重みを ws(X) とする.このとき: 1 ws(X) = k∑ i=0 pi(X)β ps(X)β , (15) この式は 3 つの項に分けられる: 1 ws(X) = s−1∑ i=0 pi(X)β ps(X)β + 1 + k∑ i=s+1 pi(X)β ps(X)β , (16) 式 16 の 1 項目はカメラ側のサブパスの頂点の情報から計算でき,3 項目は光源側のサブパスの頂点の情報から計算でき る.ここで: Pi+1(X) Pi(X) = −→p −1 · −→p 0 · · · −→p i · ←−p i+3 · · · ←−p k · ←−p k+1 −→p −1 · −→p 0 · · · −→p i−1 · ←−p i+2 · · · ←−p k · ←−p k+1 = −→p i ←−p i+2 , (17)
  13. 13. BDPT Note@CEDEC2015 13 Algorithm LCV-BDPT 1: Light Vertex Cache BDPT // Preparation phase pathLength = 0; foreach path in 10k light paths do while path not terminated do trace path.ray; if no hit then return; pathLength++; path.ray = nextRay; averageLength = pathLength / 10k; LVCache = reserve |nLightPaths| · (averageLength + 1) · 1.1; connections = max(1, ⌈ averageLength + 1 ⌉); // Light ray tracing vertexIndex = 0; foreach path in light paths do while path not terminated do LVCache[vertexIndex] = path start point; // On a light source trace path.ray; if no hit then return; LVCache[vertexIndex++] = path.vertex; path.ray = nextRay; // Camera ray tracing foreach path in camera paths do while path not terminated do trace path.ray; if no hit then return; repeat path connects to LVCache[random]; until connections; path.ray = nextRay;
  14. 14. BDPT Note@CEDEC2015 14 から,式 16 の 1 項目は: Pi(X) Ps(X) = Pi(X) Pi+1 Pi+1(X) Pi+2(X) · · · Ps−1(X) Ps(X) = ←−p i+2 −→p i · ←−p i+3 −→p i+1 · · · ←−p s+1 −→p s−1 = ∏s+1 j=i+2 ←−p j ∏s−1 j=i −→p j (18) s−1∑ i=0 pi(X)β ps(X)β = s−1∑ i=0 ∏s+1 j=i+2 ←−p β j ∏s−1 j=i −→p β j = ←−p β s+1 s−1∑ i=0   1 −→p β i s−1∏ j=i+1 ←−p β j+1 −→p β j   , (19) と表すことができ,展開することで共通する部分をキャンセルすることができる.これを再帰的な表現に直すと: s−1∑ i=0 pi(X)β ps(X)β = ←−p β s+1dE s dE s = 1 + ←−p β s dE s−1 −→p β s−1 dE 1 = 1 −→p β 0 , (20) となる.3 項目も同様に,再帰的な表現に直すと: k∑ i=s+1 pi(X)β ps(X)β = −→p β s dL s+1 dL s+1 = 1 + −→p β s+1dL s+2 ←−p β s+2 dL k = 1 ←−p β k+1 , (21) 式 16 をまとめると: 1 ws(X) =    1 + −→p β 0 dL 1 (s = 0) ←−p β k+1dE k + 1 (s = k) ←−p β s+1dE s + 1 + −→p β s dL s+1 (other). (22) 4.2.3 Implementation Implementation 2 は LVC-BDPT 実装のアウトラインである.大部分はパストレーシングと同じであり,赤い部分が 新しく実装した部分である. 4.3 Instant Bidirectional Path Tracing 4.3.1 Algorithm Instant Bidirectional Path Tracing (IBDPT) はパストレーシングとライトトレーシングを足しあわせたシンプルなアル ゴリズムである.カメラからパスをトレースし,パスの頂点 yi を光源上の点 z と接続する explicit view path (y0, · · · , yiz) 戦略,カメラからトレースしたパスが光源に当たる implicit view path (y0, · · · , yi) 戦略,光源からパスをトレースし, パスの頂点 zi をカメラ上の点 y と接続する explicit light path (z0, · · · , yiy) 戦略,光源からトレースしたパスがカメラ に当たる implicit light path (z0, · · · , zi) 戦略,IBDPT ではこの 4 つの戦略を考慮する. 経路 X = x0, · · · , xk について考える.explicit view path 戦略で経路 X をサンプルする場合の pdf pVE (X) は pVE (X) = k−2∏ i=−1 −→p i · ←−p k+1, (23)
  15. 15. BDPT Note@CEDEC2015 15 Implementation LVC-BDPT 2: Light Vertex Cache BDPT implementation outline // Light ray tracing maxDepth = averageLength; setupLightRay(); // Generate light rays explicitConnectinoLightToCamera(); // Connect light source to camera for pathLength = 1 to maxDepth do castRay(); sampleBrdf(); if pathLength == maxDepth then break; explicitConnectionToCamera(); // Connect light subpath to camera sampleSurfaceSecondary(); cacheLightVertex(); // Cache current vertex data // Camera ray tracing maxDepth = maxRecursino; setupCameraRay(); for pathLength = 1 to maxDepth do castRay(); sampleBrdf(); if pathLength == 1 then initializeCameraPathMisWeightTerm(); else calcCameraPathMisWeightTerm(); implicitConnection(); if pathLength == maxDepth then break; explicitConnectionToLight(); // Connect camera subpath to light source and light subpath sampleSurfaceSecondary(); updateCameraPathMisWeightTerm();
  16. 16. BDPT Note@CEDEC2015 16 implicit view path 戦略で経路 X をサンプルする場合の pdf pVI (X) は pVI (X) = k−1∏ i=−1 −→p i, (24) explicit light path 戦略で経路 X をサンプルする場合の pdf pLE (X) は pLE (X) = −→p −1 · k+1∏ i=2 ←−p i, (25) implicit light path 戦略で経路 X をサンプルする場合の pdf pLI (X) は pLI (X) = k+1∏ i=1 ←−p i, (26) となる. 4.3.2 Multiple Importance Sampling 経路 X = x0, · · · , xk における explicit view path, implicit view path,explicit light path, implicit light path 戦 略の MIS のパワーヒューリスティック重みをそれぞれ wVE (X), wVI (X),wLE (X), wLI (X) とすると: wVE (X) = pVE (X)β pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β wVI (X) = pVI (X)β pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β wLE (X) = pLE (X)β pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β wLI (X) = pLI (X)β pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β , (27) と表せられ,explicit view path の重みの逆数は: 1 wVE (X) = pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β pVE (X)β = 1 + pVI (X)β pVE (X)β + pLE (X)β pVE (X)β + pLI (X)β pVE (X)β = 1 + pVI (X)β pVE (X)β + pLE (X)β pVE (X)β ( 1 + pLI (X)β pLE (X)β ) = 1 + ( pVI (X) pVE (X) )β + ( pLE (X) pVE (X) )β ( 1 + ( pLI (X) pLE (X) )β ) , (28) implicit view path の重みの逆数は: 1 wVI (X) = pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β pVI (X)β = 1 + pVE (X)β pVI (X)β + pLE (X)β pVI (X)β + pLI (X)β pVI (X)β = 1 + pVE (X)β pVI (X)β + pLE (X)β pVI (X)β ( 1 + pLI (X)β pLE (X)β ) = 1 + pVE (X)β pVI (X)β ( 1 + pLE (X)β pVE (X)β ( 1 + pLI (X)β pLE (X)β )) = 1 +   1 pVI (X) pVE (X)   β ( 1 + ( pLE (X) pVE (X) )β ( 1 + ( pLI (X) pLE (X) )β )) , (29)
  17. 17. BDPT Note@CEDEC2015 17 explicit light path の重みの逆数は: 1 wLE (X) = pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β pLE (X)β = 1 + pVE (X)β pLE (X)β + pVI (X)β pLE (X)β + pLI (X)β pLE (X)β = 1 + pVE (X)β pLE (X)β ( 1 + pVI (X)β pVE (X)β ) + pLI (X)β pLE (X)β = 1 + ( pVE (X) pLE (X) )β ( 1 + ( pVI (X) pVE (X) )β ) + ( pLI (X) pLE (X) )β , (30) implicit light path の重みの逆数は: 1 wLI (X) = pVE (X)β + pVI (X)β + pLE (X)β + pLI (X)β pLI (X)β = 1 + pVE (X)β pLI (X)β + pVI (X)β pLI (X)β + pLE (X)β pLI (X)β = 1 + pVE (X)β pLI (X)β ( 1 + pVI (X)β pVE (X)β ) + pLE (X)β pLI (X)β = 1 + pLE (X)β pLI (X)β ( 1 + pVE (X)β pLE (X)β ( 1 + pVI (X)β pVE (X)β )) = 1 +   1 pLI (X) pLE (X)   β ( 1 + ( pVE (X) pLE (X) )β ( 1 + ( pVI (X) pVE (X) )β )) , (31) となる.implicit view path と explicit view path の pdf の比は: pVI (X) pVE (X) = ∏k−1 i=−1 −→p i ∏k−2 i=−1 −→p i · ←−p k+1 = −→p k−1 ←−p k+1 , (32) implicit light path と explicit light path の pdf の比は: pLI (X) pLE (X) = ∏k+1 i=1 ←−p i −→p −1 · ∏k+1 i=2 ←−p i = ←−p 1 −→p −1 (33) となり,大部分はキャンセルされる.explicit light path と explicit view path の pdf の比は: pLE (X) pVE (X) = −→p −1 · ∏k+1 i=2 ←−p i ∏k−2 i=−1 −→p i · ←−p k+1 = 1 P(x−1 → x0 → x1) · 1 P(x0 → x1 → x2)G(x0 ↔ x1) · P(x1 ← x2 ← x3) P(x1 → x2 → x3) · · · P(xk−3 ← xk−2 ← xk−1) P(xk−3 → xk−2 → xk−1) · P(xk−2 ← xk−1 ← xk) · P(xk−1 ← xk ← xk+1)G(xk−1 ↔ xk) = k∏ i=0 si, (34) となる.si はパストレース,ライトトレース時の頂点 i の時に求めることができ,パストレース時は: s0 = 1 P(x−1 → x0 → x1) s1 = 1 P(x0 → x1 → x2)G(x0 ↔ x1) si = P(xi−1 ← xi ← xi+1) P(xi−1 → xi → xi+1) sk−1 = P(xk−2 ← xk−1 ← xk) sk = P(xk−1 ← xk ← xk+1)G(xk−1 ↔ xk), (35)
  18. 18. BDPT Note@CEDEC2015 18 ライトトレース時は: s0 = 1 P(x−1 → x0 → x1)G(x0 ↔ x1) s1 = 1 P(x0 → x1 → x2) si = P(xi−1 ← xi ← xi+1) P(xi−1 → xi → xi+1) sk−1 = P(xk−2 ← xk−1 ← xk)G(xk−1 ↔ xk) sk = P(xk−1 ← xk ← xk+1), (36) となる. ンホールカメラを用いる場合,implicit light path 戦略は考慮しない.この時,式 27 は: wVE (X) = pVE (X)β pVE (X)β + pVI (X)β + pLE (X)β wVI (X) = pVI (X)β pVE (X)β + pVI (X)β + pLE (X)β wLE (X) = pLE (X)β pVE (X)β + pVI (X)β + pLE (X)β , (37) となり: 1 wVE (X) = pVE (X)β + pVI (X)β + pLE (X)β pVE (X)β = 1 + pVI (X)β pVE (X)β + pLE (X)β pVE (X)β = 1 + ( pVI (X) pVE (X) )β + ( pLE (X) pVE (X) )β 1 wVI (X) = pVE (X)β + pVI (X)β + pLE (X)β pVI (X)β = 1 + pVE (X)β pVI (X)β + pLE (X)β pVI (X)β = 1 + pVE (X)β pVI (X)β ( 1 + pLE (X)β pVE (X)β ) = 1 +   1 pVI (X) pVE (X)   β ( 1 + ( pLE (X) pVE (X) )β ) 1 wLE (X) = pVE (X)β + pVI (X)β + pLE (X)β pLE (X)β = 1 + pVE (X)β pLE (X)β + pVI (X)β pLE (X)β = 1 + pVE (X)β pLE (X)β ( 1 + pVI (X)β pVE (X)β ) = 1 + ( pVE (X) pLE (X) )β ( 1 + ( pVI (X) pVE (X) )β ) (38) となる.
  19. 19. BDPT Note@CEDEC2015 19 おわりに 今回はじめて CEDEC の講演の追加資料をまとめてみました。どうでしたか。コメントやアドバイス等ありましたら、 takahiroharada at gmail dot com までお願いします。 参考文献 [Antwerpen, 2011] Antwerpen, D. V. (2011). Recursive MIS Computation for Streaming BDPT on the GPU. PhD thesis. [Bogolepov et al., 2013] Bogolepov, D., Ulyanov, D., Sopin, D., and Turlapov, V. (2013). GPU-Optimized Bi-Directional Path Tracing. In WSCG 2013: poster proceedings: 21st International Conference in Central Europe on Computer Graphics, Visualization and Computer Vision in co-operation with EUROGRAPHICS Association, pages 57–60. V´aclav Skala - UNION Agency. [Davidoviˇc et al., 2014] Davidoviˇc, T., Kiv´anek, J., Haˇsan, M., and Slusallek, P. (2014). Progressive Light Transport Simulation on the GPU. ACM Transactions on Graphics, 33(3):1–19.

×