SlideShare a Scribd company logo
1 of 19
Download to read offline
双方向パストレーシング(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
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() を用いている。
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 ) ;
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 になるということである。このようにピクセルごとの重みを変えて結果
を足し合わせることをマルチプルインポータンスサンプリングと言う。
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 ) ;
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) は長く計算を行わなければ、ノイズが気にならないレベルまで落ちない。これは何故かというと関
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 で割れば(画像の平均を求める)、最適ではないが正しい結果画像が求まると述べた。
BDPT Note@CEDEC2015 8
図 10: パストレーシングの拡張。
図 11: パストレーシングと Fig. 10 のアルゴリズムとの比較。
Fig. 12 ではこれらの 2 つテクニックだけでなく、それ以外にも複数のテクニックを用いて有効な経路を構築している。
それぞれのテクニックが Fig. 12(a), (b) と同様に正しい結果画像を求めることができるので n 個のテクニックを用いた
結果を足し合わせると結果画像が n 倍明るいものになってしまう。正しい画像にするためには、全てのテクニックで求
めた結果画像を足し合わせ、n で割ればとりあえず求めたい結果画像を求めることができる。
しかし単に画像の平均をとるのは Sec. 1.6 で述べた例と同様に、最適な重み付けではない。それはそれぞれのテクニッ
クが得意とする光の経路があるため、最適な重み付けはテクニックの有効性を考慮してそれぞれのピクセルごとの重み
を計算することである。これは Sec. 1.6 で示したマルチプルインポータンスサンプリングを拡張したものに他ならない。
BDPT Note@CEDEC2015 9
(a) (b)
(c) (d)
(e) (f)
図 12: カメラとライトの双方向から光の経路を構築し、それらの経路を途中でつなぎ合わせてできる有効な経路。
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)
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)
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)
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;
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)
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();
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)
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)
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)
となる.
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.

More Related Content

What's hot

コンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィコンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィNorishige Fukushima
 
30th コンピュータビジョン勉強会@関東 DynamicFusion
30th コンピュータビジョン勉強会@関東 DynamicFusion30th コンピュータビジョン勉強会@関東 DynamicFusion
30th コンピュータビジョン勉強会@関東 DynamicFusionHiroki Mizuno
 
Killzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemKillzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemGuerrilla
 
輪読発表資料: Efficient Virtual Shadow Maps for Many Lights
輪読発表資料: Efficient Virtual Shadow Maps for Many Lights輪読発表資料: Efficient Virtual Shadow Maps for Many Lights
輪読発表資料: Efficient Virtual Shadow Maps for Many Lightsomochi64
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2Guerrilla
 
Lighting Shading by John Hable
Lighting Shading by John HableLighting Shading by John Hable
Lighting Shading by John HableNaughty Dog
 
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜SSII
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow MappingSukwoo Lee
 
フォトンマッピング入門
フォトンマッピング入門フォトンマッピング入門
フォトンマッピング入門Shuichi Hayashi
 
Calibrating Lighting and Materials in Far Cry 3
Calibrating Lighting and Materials in Far Cry 3Calibrating Lighting and Materials in Far Cry 3
Calibrating Lighting and Materials in Far Cry 3stevemcauley
 
物理ベースレンダラedupt解説
物理ベースレンダラedupt解説物理ベースレンダラedupt解説
物理ベースレンダラedupt解説h013
 
Taking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationTaking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationGuerrilla
 
smallpt: Global Illumination in 99 lines of C++
smallpt:  Global Illumination in 99 lines of C++smallpt:  Global Illumination in 99 lines of C++
smallpt: Global Illumination in 99 lines of C++鍾誠 陳鍾誠
 
Photogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontPhotogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontElectronic Arts / DICE
 
物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現
物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現
物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現Silicon Studio Corporation
 
Low-level Shader Optimization for Next-Gen and DX11 by Emil Persson
Low-level Shader Optimization for Next-Gen and DX11 by Emil PerssonLow-level Shader Optimization for Next-Gen and DX11 by Emil Persson
Low-level Shader Optimization for Next-Gen and DX11 by Emil PerssonAMD Developer Central
 
A Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemA Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemBo Li
 
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)포프 김
 
SPADE :Semantic Image Synthesis with Spatially-Adaptive Normalization
SPADE :Semantic Image Synthesis with Spatially-Adaptive NormalizationSPADE :Semantic Image Synthesis with Spatially-Adaptive Normalization
SPADE :Semantic Image Synthesis with Spatially-Adaptive NormalizationTenki Lee
 

What's hot (20)

コンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィコンピューテーショナルフォトグラフィ
コンピューテーショナルフォトグラフィ
 
30th コンピュータビジョン勉強会@関東 DynamicFusion
30th コンピュータビジョン勉強会@関東 DynamicFusion30th コンピュータビジョン勉強会@関東 DynamicFusion
30th コンピュータビジョン勉強会@関東 DynamicFusion
 
Killzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo PostmortemKillzone Shadow Fall Demo Postmortem
Killzone Shadow Fall Demo Postmortem
 
輪読発表資料: Efficient Virtual Shadow Maps for Many Lights
輪読発表資料: Efficient Virtual Shadow Maps for Many Lights輪読発表資料: Efficient Virtual Shadow Maps for Many Lights
輪読発表資料: Efficient Virtual Shadow Maps for Many Lights
 
The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2The Rendering Technology of Killzone 2
The Rendering Technology of Killzone 2
 
MIVS
MIVSMIVS
MIVS
 
Lighting Shading by John Hable
Lighting Shading by John HableLighting Shading by John Hable
Lighting Shading by John Hable
 
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
SSII2020TS: 物理ベースビジョンの過去・現在・未来 〜 カメラ・物体・光のインタラクションを モデル化するには 〜
 
Cascade Shadow Mapping
Cascade Shadow MappingCascade Shadow Mapping
Cascade Shadow Mapping
 
フォトンマッピング入門
フォトンマッピング入門フォトンマッピング入門
フォトンマッピング入門
 
Calibrating Lighting and Materials in Far Cry 3
Calibrating Lighting and Materials in Far Cry 3Calibrating Lighting and Materials in Far Cry 3
Calibrating Lighting and Materials in Far Cry 3
 
物理ベースレンダラedupt解説
物理ベースレンダラedupt解説物理ベースレンダラedupt解説
物理ベースレンダラedupt解説
 
Taking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next GenerationTaking Killzone Shadow Fall Image Quality Into The Next Generation
Taking Killzone Shadow Fall Image Quality Into The Next Generation
 
smallpt: Global Illumination in 99 lines of C++
smallpt:  Global Illumination in 99 lines of C++smallpt:  Global Illumination in 99 lines of C++
smallpt: Global Illumination in 99 lines of C++
 
Photogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars BattlefrontPhotogrammetry and Star Wars Battlefront
Photogrammetry and Star Wars Battlefront
 
物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現
物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現
物理ベース?アート指向? ~尤もらしさと自由度を両立するレンズフレア表現
 
Low-level Shader Optimization for Next-Gen and DX11 by Emil Persson
Low-level Shader Optimization for Next-Gen and DX11 by Emil PerssonLow-level Shader Optimization for Next-Gen and DX11 by Emil Persson
Low-level Shader Optimization for Next-Gen and DX11 by Emil Persson
 
A Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering SystemA Scalable Real-Time Many-Shadowed-Light Rendering System
A Scalable Real-Time Many-Shadowed-Light Rendering System
 
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
 
SPADE :Semantic Image Synthesis with Spatially-Adaptive Normalization
SPADE :Semantic Image Synthesis with Spatially-Adaptive NormalizationSPADE :Semantic Image Synthesis with Spatially-Adaptive Normalization
SPADE :Semantic Image Synthesis with Spatially-Adaptive Normalization
 

Viewers also liked

Progressive photon mapping
Progressive photon mappingProgressive photon mapping
Progressive photon mappingdenniskempin
 
Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...
Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...
Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...Takahiro Harada
 
[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering Workflow
[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering Workflow[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering Workflow
[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering WorkflowTakahiro Harada
 
The Importance of Terminology and sRGB Uncertainty - Notes - 0.4
The Importance of Terminology and sRGB Uncertainty - Notes - 0.4The Importance of Terminology and sRGB Uncertainty - Notes - 0.4
The Importance of Terminology and sRGB Uncertainty - Notes - 0.4Thomas Mansencal
 
Screen Space Reflections in The Surge
Screen Space Reflections in The SurgeScreen Space Reflections in The Surge
Screen Space Reflections in The SurgeMichele Giacalone
 
Deferred rendering in Dying Light
Deferred rendering in Dying LightDeferred rendering in Dying Light
Deferred rendering in Dying LightMaciej Jamrozik
 
Introducing Firerender for 3DS Max
Introducing Firerender for 3DS MaxIntroducing Firerender for 3DS Max
Introducing Firerender for 3DS MaxTakahiro Harada
 
Physics Tutorial, GPU Physics (GDC2010)
Physics Tutorial, GPU Physics (GDC2010)Physics Tutorial, GPU Physics (GDC2010)
Physics Tutorial, GPU Physics (GDC2010)Takahiro Harada
 
[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRays
[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRays[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRays
[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRaysTakahiro Harada
 
確率的ライトカリング 理論と実装 (CEDEC2016)
確率的ライトカリング 理論と実装 (CEDEC2016)確率的ライトカリング 理論と実装 (CEDEC2016)
確率的ライトカリング 理論と実装 (CEDEC2016)Takahiro Harada
 
Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)
Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)
Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)Takahiro Harada
 
Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)Takahiro Harada
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnGuerrilla
 

Viewers also liked (13)

Progressive photon mapping
Progressive photon mappingProgressive photon mapping
Progressive photon mapping
 
Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...
Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...
Introduction to Bidirectional Path Tracing (BDPT) & Implementation using Open...
 
[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering Workflow
[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering Workflow[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering Workflow
[2017 GDC] Radeon ProRender and Radeon Rays in a Gaming Rendering Workflow
 
The Importance of Terminology and sRGB Uncertainty - Notes - 0.4
The Importance of Terminology and sRGB Uncertainty - Notes - 0.4The Importance of Terminology and sRGB Uncertainty - Notes - 0.4
The Importance of Terminology and sRGB Uncertainty - Notes - 0.4
 
Screen Space Reflections in The Surge
Screen Space Reflections in The SurgeScreen Space Reflections in The Surge
Screen Space Reflections in The Surge
 
Deferred rendering in Dying Light
Deferred rendering in Dying LightDeferred rendering in Dying Light
Deferred rendering in Dying Light
 
Introducing Firerender for 3DS Max
Introducing Firerender for 3DS MaxIntroducing Firerender for 3DS Max
Introducing Firerender for 3DS Max
 
Physics Tutorial, GPU Physics (GDC2010)
Physics Tutorial, GPU Physics (GDC2010)Physics Tutorial, GPU Physics (GDC2010)
Physics Tutorial, GPU Physics (GDC2010)
 
[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRays
[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRays[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRays
[2016 GDC] Multiplatform GPU Ray-Tracing Solutions With FireRender and FireRays
 
確率的ライトカリング 理論と実装 (CEDEC2016)
確率的ライトカリング 理論と実装 (CEDEC2016)確率的ライトカリング 理論と実装 (CEDEC2016)
確率的ライトカリング 理論と実装 (CEDEC2016)
 
Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)
Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)
Introduction to Monte Carlo Ray Tracing, OpenCL Implementation (CEDEC 2014)
 
Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)Forward+ (EUROGRAPHICS 2012)
Forward+ (EUROGRAPHICS 2012)
 
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero DawnPlayer Traversal Mechanics in the Vast World of Horizon Zero Dawn
Player Traversal Mechanics in the Vast World of Horizon Zero Dawn
 

More from Takahiro Harada

201907 Radeon ProRender2.0@Siggraph2019
201907 Radeon ProRender2.0@Siggraph2019201907 Radeon ProRender2.0@Siggraph2019
201907 Radeon ProRender2.0@Siggraph2019Takahiro Harada
 
[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...
[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...
[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...Takahiro Harada
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Takahiro Harada
 
Foveated Ray Tracing for VR on Multiple GPUs
Foveated Ray Tracing for VR on Multiple GPUsFoveated Ray Tracing for VR on Multiple GPUs
Foveated Ray Tracing for VR on Multiple GPUsTakahiro Harada
 
A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)
A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)
A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)Takahiro Harada
 
Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...
Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...
Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...Takahiro Harada
 
Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)
Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)
Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)Takahiro Harada
 
A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)
A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)
A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)Takahiro Harada
 

More from Takahiro Harada (8)

201907 Radeon ProRender2.0@Siggraph2019
201907 Radeon ProRender2.0@Siggraph2019201907 Radeon ProRender2.0@Siggraph2019
201907 Radeon ProRender2.0@Siggraph2019
 
[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...
[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...
[2018 GDC] Real-Time Ray-Tracing Techniques for Integration into Existing Ren...
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)
 
Foveated Ray Tracing for VR on Multiple GPUs
Foveated Ray Tracing for VR on Multiple GPUsFoveated Ray Tracing for VR on Multiple GPUs
Foveated Ray Tracing for VR on Multiple GPUs
 
A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)
A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)
A 2.5D Culling for Forward+ (SIGGRAPH ASIA 2012)
 
Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...
Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...
Using GPUs for Collision detection, Recent Advances in Real-Time Collision an...
 
Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)
Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)
Heterogeneous Particle based Simulation (SIGGRAPH ASIA 2011)
 
A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)
A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)
A Parallel Constraint Solver for a Rigid Body Simulation (SIGGRAPH ASIA 2011)
 

Recently uploaded

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (9)

スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

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

  • 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. 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. 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. 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. 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. 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. 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. 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. BDPT Note@CEDEC2015 9 (a) (b) (c) (d) (e) (f) 図 12: カメラとライトの双方向から光の経路を構築し、それらの経路を途中でつなぎ合わせてできる有効な経路。
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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.