introduction to monte carlo ray tracing (cedec 2013)

96
モンテカルロレイトレーシングの基礎から OpenCLによる実装まで TAKAHIRO HARADA

Upload: takahiro-harada

Post on 22-May-2015

3.733 views

Category:

Technology


4 download

TRANSCRIPT

Page 1: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

モンテカルロレイトレーシングの基礎からOpenCLによる実装まで

TAKAHIRO HARADA

Page 2: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

2 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

レイトレーシング

} ラスタライゼーション –  トライアングルを順番に画面に貼って行く – DX, OpenGL

} レイトレーシング – もう一つのレンダリング方法 – ピクセルの色を順番に求める

} リアルタイムグローバルイルミネーション – 近年Hot – モンテカルロレイトレーシングは”the solution” – リアルタイムアルゴリズムを考える上で知っておくことは重要

•  リアルタイム化 == これをどう簡略化するか

Page 3: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

3 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MOTIVATION

} GI (MCRT) looks scary – PBRT本は重すぎ… – 数式多すぎ…

•  Search for “Monte Carlo Integration”, “Importance Sampling” on Wikipedia

} 本セッション – より直感的な理解を – Give more intuitive understanding – Not for PBRT lovers – Not for equation lovers

Page 4: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

4 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

AGENDA

} Basic Topics } Advanced Topics

} OpenCL Implementation

Page 5: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

BASIC TOPICS

Page 6: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

6 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

FIND VISIBLE POINT

} ピクセルごとにレイを生成 } レイが表面にぶつかった点のうち最も近いものを見つける

} Brute-force – 全てのトライアングルに対して

•  t_min = min2( t_min, intersect( ray, tri[i] ) ) – 効率が悪い

} 空間分割を導入することで効率化可能 – Bounding Volume Hierarchy (BVH)

Page 7: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

7 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

FIND VISIBLE POINT

} ピクセルごとにレイを生成 } レイが表面にぶつかった点のうち最も近いものを見つける

} Brute-force – 全てのトライアングルに対して

•  t_min = min2( t_min, intersect( ray, tri[i] ) ) – 効率が悪い

} 空間分割を導入することで効率化可能 – Bounding Volume Hierarchy (BVH)

Page 8: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

8 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MAJOR SURFACE TYPES

Page 9: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

9 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFLECTION (SPECULAR)

} 鏡面反射

} 出射する光の強さ == 入射する光の強さ*

θi = θo

* フレネルを除くと

Page 10: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

10 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFLECTION (SPECULAR)

} 鏡面反射

} 出射する光の強さ == 入射する光の強さ*

θi = θo

* フレネルを除くと

Page 11: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

11 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFLECTION (SPECULAR)

} 鏡面反射

} 出射する光の強さ == 入射する光の強さ*

θi = θo

* フレネルを除くと

Page 12: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

12 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFRACTION (SPECULAR)

} Transmission } 光が表面で方向を変える

} スネルの法則 (Snell’s law)

} 実際は反射も起こる

ηi sin θi = ηo sin θo

Page 13: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

13 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFRACTION + REFLECTION

} どのような透明な物体でも表面で光を反射させる } 屈折と反射の割合

– フレネル効果 (Fresnel) – 屈折率

Page 14: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

14 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

FRESNEL

} 割合は一様ではない } 視線ベクトルと表面の法線ベクトルの角度

– 平行ならば •  屈折が強い

– 垂直ならば •  反射が強い

Reflection

Refraction

Reflection

Refraction

<

<

Page 15: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

15 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

FRESNEL

} 割合は一様ではない } 視線ベクトルと表面の法線ベクトルの角度

– 平行ならば •  屈折が強い

– 垂直ならば •  反射が強い

} Schlick’s approximation

Schlick

View : Normal = Orthogonal

View : Normal = Parallel

 Small IOR  Large IOR

Page 16: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

16 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFRACTION + REFLECTION

} 表面で二本のレイをキャスト* – 反射のレイ – 屈折のレイ

* レイの数が増えすぎる問題はあるが

Page 17: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

17 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFLECTION (SPECULAR)

} 鏡面反射

} 出射する光の強さ == 入射する光の強さ x フレネル

θi = θo

Page 18: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

18 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

} レイトレーシング } モンテカルロレイトレーシング

Page 19: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

19 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MAJOR SURFACE TYPES

Page 20: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

MONTE CARLO RAY TRACING

Page 21: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

21 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATT

} Lambert } Oren Nayar

– よりMattな表面

Page 22: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

22 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATT

} Lambert } 表面に当たった光は全ての方向に反射

} ある方向に出て行く光は全ての方向から入ってきた光で決まる

Page 23: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

23 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATT

} Lambert } 表面に当たった光は全ての方向に反射

} ある方向に出て行く光は全ての方向から入ってきた光で決まる } どうやって全ての方向から入射する光を求める?

Page 24: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

24 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATT

} Lambert } 表面に当たった光は全ての方向に反射

} ある方向に出て行く光は全ての方向から入ってきた光で決まる } どうやって全ての方向から入射する光を求める?

– 光源が占める角度を知りたい – 点光源の場合は簡単

Page 25: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

25 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATT

} Lambert } 表面に当たった光は全ての方向に反射

} ある方向に出て行く光は全ての方向から入ってきた光で決まる } どうやって全ての方向から入射する光を求める?

– 光源が占める角度を知りたい – 点光源の場合は簡単 – 面光源の場合は?

•  Monte Carlo Integration!

Page 26: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

26 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

INTEGRATE INCOMING LIGHT

} どれだけの光が半球から入ってくるか?

} Q: 光源の占める角度を知りたい

Page 27: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

27 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

IDEA

} 半球を分割 } それぞれの領域について光源があるかチェック

Page 28: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

28 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

IDEA

} 半球を分割 } それぞれの領域について光源があるかチェック

} それぞれの領域にレイを飛ばす – Sampleを生成する

Page 29: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

29 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

IDEA

} 8本のレイ(sample)のうち2本ヒット } 半球の約2/8が光源に覆われていると推測できる

} 定式化は – 単位半球上の面積 (3D) – 単位半円上の長さ (2D)

•  割合 x 円周 = 28 π

Page 30: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

30 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

IDEA

} 半球を分割

} それぞれの領域について光源があるかチェック –  8 samples

} サンプルの重み (正規化)

} 2ヒット

(== ratio to total length)

} 単位半円の円周 (2D)

} 光源の面積

Flatten

π × 28 = π

i<8

∑i=0

18 L(i) = π

i<8

∑i=0

wiL(i)

wi = 18 , ∑ wi = 1

π = ∫Ωdω

28

≈ ∫ΩL(ω)dω

Page 31: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

31 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MOTE CARLO INTEGRATION

} ランダムなレイ(sample) を引く (Draw)

} サンプルが光源に当たるかチェック –  8 samples

} サンプルの重み

} 2ヒット

} 光源の面積 –  総サンプル数で割る (正規化)

Flatten wi = π, ∑ wi = 8π

18 × 2π = 2

8 π

Page 32: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

32 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MONTE CARLO INTEGRATION

} A numerical integration suited for –  Integration of a complex high dimensional function

} Draw a random sample } Calculate a weighted average

∫ΩL(ω)dω ≈

i<8

∑i=0

wiLi

= 1n

i<n

∑i=0

Li

pdfi

pdfi = 1π

, n = 8

Formula we see in a textbook

Page 33: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

33 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATT

} Lambert } 表面に当たった光は全ての方向に反射

} ある方向に出て行く光は全ての方向から入ってきた光で決まる } どうやって全ての方向から入射する光を求める?

– 光源が占める角度を知りたい

Page 34: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

34 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATT SURFACE EVALUATION

Ray0 Ray1 Ray2 Ray3 Ray4 Ray5 Ray6 Ray7 Hit? 0 0 0 0 0 0 1 1 Brdf 1/pi 1/pi 1/pi 1/pi 1/pi 1/pi 1/pi 1/pi

cos(n,l) c0 c1 c2 c3 c4 c5 c6 c7

Li(ωi) = ∫ΩfwhiteLi(ωi)cos θdω

( 1π

c6 + 1π

c7) π8

∫ΩL(ω)dω

+

x x x x x x x x

Page 35: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

35 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

WHERE PI COMES FROM?

} Lambert } Distribute energy uniformly

} Pure white surface –  Incoming light == sum of outgoing light (reflected

light)

} BRDF for a Lambert surface

flambert(x, ωi, ωo) = Rπ

Li(ωi) = ∫ΩfwhiteLi(ωi)cos θdω fwhite = 1

π

==

Incoming light Sum of reflected light

The image cannot be displayed. Your computer may not have enough memory to open the image, or the image may have been corrupted. Restart your computer, and then open the file again. If the red x still appears, you may have to delete the image and then insert it again.

Page 36: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

36 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REFLECTION SURFACE EVALUATION

Ray0 Ray1 Ray2 Ray3 Ray4 Ray5 Ray6 Ray7 Hit? 0 0 0 0 0 0 1 1 Brdf 0 0 0 0 0 0 0 b7

cos(n,l) c0 c1 c2 c3 c4 c5 c6 c7

(b7c7)π8

+

x x x x x x x x

Page 37: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

37 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

GLOSSY

} Microfacet } 様々なglossinessを表現できる

– 鋭いspecularに近いものから鈍いmattに近いものまで

Page 38: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

38 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

GLOSSY

} Microfacet } 様々なglossinessを表現できる

– 鋭いspecularに近いものから鈍いmattに近いものまで

} Torrance-Sparrowモデル – 表面の法線は分散を持っている (Distribution) D – フレネル F – 表面自体のocclusion G

Wide distribution Mid distribution Narrow distribution

fmf (n, l, e) = DFG4 cos(n, l)cos(n, e)

Page 39: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

39 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

GLOSSY (MICROFACET)

} Microfacet } 様々なglossinessを表現できる

– 鋭いspecularに近いものから鈍いmattに近いものまで

} Torrance-Sparrowモデル – 表面の法線は分散を持っている (Distribution) D – フレネル F – 表面自体のocclusion G

Page 40: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

40 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

GLOSSY SURFACE EVALUATION

Ray0 Ray1 Ray2 Ray3 Ray4 Ray5 Ray6 Ray7 Hit? 0 0 0 0 0 0 1 1 Brdf b0 b1 b2 b3 b4 b5 b6 b7

cos(n,l) c0 c1 c2 c3 c4 c5 c6 c7

(b6c6 + b7c7) π8

+

x x x x x x x x

Page 41: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

ADVANCED TOPICS

} Why noisy result? } Better sampling

} How can we make a realistic material? } Complex materials

} Want to have light bounce }  Indirect illumination

} Where are nice effects? } Distributed ray tracing

Page 42: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

NOISE REDUCTION (IMPORTANCE SAMPLING)

Page 43: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

43 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

BETTER SAMPLING

} ノイズはどこから? } Monte Carlo Integrationを使っているから

– サンプルの数が十分ではない – ランダムサンプリング – サンプルの取り方の小さな違い

•  => 異なった結果

Page 44: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

44 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

BETTER SAMPLING

} 均一な分割を用いてサンプルを生成した } 運が悪いと結果が大きく異なる

Flatten

Ans = 2/8 (8 samples)

Page 45: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

45 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

BETTER SAMPLING

} 均一な分割を用いてサンプルを生成した } 運が悪いと結果が大きく異なる

} どうにか改善できないか? – もし光源の場所がわかっていたら? Flatten

Ans = 1/8 (8 samples)

Page 46: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

46 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

BETTER SAMPLING

} 均一ではないスプリット } 重みを変える必要がある

} より多くのサンプルを光源方向に –  6 samples, w = 1/16 –  2 samples, w = 5/16

} 光源の面積 Flatten

Ans = 3/16 pi (8 samples) 1/16 5/16

116 × 3 × π = 3

16 π

Page 47: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

47 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

BETTER SAMPLING

} 均一ではないスプリット } 重みを変える必要がある

} より多くのサンプルを光源方向に –  4 samples, w = 1/16 –  2 samples, w = 6/16

} 光源の面積

} サンプル数を減らしたけど同じ結果 – 精度の向上

} Importance sampling – より多くのサンプルをターゲットの周辺に – 重みを修正 (pdfを上げる、下げる) – ライトサンプリング

Flatten

Ans = 3/16 pi (6 samples) 1/16 6/16

116 × 3 × π = 3

16 π

Page 48: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

48 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

IMPORTANCE SAMPLING EXAMPLE

Uniform Sampling Light Sampling

Page 49: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

49 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

LIGHT SAMPLING ENOUGH?

Matt Surface

} ライトサンプリングが有効

Glossy Surface

} ライトサンプリングが有効ではない } BRDFの値の大きい方向にサンプルを生成した方が

よい – BRDFサンプリング

Page 50: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

50 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

IMPORTANCE SAMPLING

} ライトサンプリング

} BRDFサンプリング

} Multiple importance sampling –  Sample light, but adjust weight by BRDF distribution –  Sample BRDF, but adjust weight by Light distribution

better >>>> worse

worse <<<< better

Page 51: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

COMPLEX MATERIALS

Page 52: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

52 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

LITTLE BIT MORE ABOUT MATT

} どんなMattな表面でも光を鏡面反射している – 紙でも – 完全な拡散だけではない – ある程度の光が鏡面反射し、ある程度の光が拡散

} 見る角度によって反射が変わる?

Page 53: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

53 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REALISTIC MATT MATERIAL

} どんなMattな表面でも光を鏡面反射している – 紙でも – 完全な拡散だけではない – ある程度の光が鏡面反射し、ある程度の光が拡散

} 見る角度によって反射が変わる? – 表面でフレネルの効果が起こっている – 物体の屈折率 (ior)

Page 54: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

54 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REALISTIC MATT MATERIAL

} どんなMattな表面でも光を鏡面反射している – 紙でも – 完全な拡散だけではない – ある程度の光が鏡面反射し、ある程度の光が拡散

} 見る角度によって反射が変わる? – 表面でフレネルの効果が起こっている – 物体の屈折率 (ior) – 透明な物体の反射屈折に似ている

Page 55: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

55 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

WHAT IS MATT SURFACE??

} どんな表面でも光は鏡面反射 } 反射しなかった光は内部に屈折

– 散乱せずに直進するのが純粋な屈折 – Mattな表面は屈折した光が散乱してどの方向にも均等に出て行く

Page 56: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

56 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

REALISTIC MATT MATERIAL

} モデル化 –  2 layer model –  1st layer: Specular –  2nd layer: Matt

} Spec x (1-f) + Matt x f –  f == Fresnel

1-f

f

Page 57: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

57 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

WHAT WE HAVE SO FAR

} いくつかのBRDFモデルのみ } どの表面でもフレネル効果が現れている

} これらだけでリアルなマテリアルの表現ができるのか?

Specular (R) Glossy Matt Specular (T)

Page 58: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

58 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

COMPLEX MATERIAL EXAMPLES

Page 59: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

59 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

WOOD TILE

} 2レイヤーモデル – Glossy – Matt

} Glossy x (1-f) + Matt x f

1-f

f

Page 60: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

60 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

WOOD TILE

} 2レイヤーモデル – Glossy – Matt

} Glossy x (1-f) + Matt x f

1-f

f

x (1-f) + x f

Page 61: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

61 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

CARBON FIBER

} 3レイヤーモデル – Specular – Glossy – Matt

1-f

f

1-f

f

Page 62: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

62 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

Matt Glossy M+G M+G+Specular

Page 63: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

63 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

SOMETHING

} 4レイヤーモデル – Specular – Refraction – Glossy – Matt

1-f

f

1-f

f

1-f

f

Page 64: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

64 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

Matt + Glossy Transparent M+G+T M+G+T+Specular

Page 65: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

65 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MATERIAL DESCRIPTION

} fres(G, M) } fres(S, mix(G, M, 0.5))

} fres(S, add(T, fres(G, M)))

Page 66: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

INDIRECT ILLUMINATION

Page 67: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

67 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

COMPARISON

Direct Illumination Indirect Illumination

Page 68: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

68 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

INDIRECT ILLUMINATION

} ダイレクトイルミネーション – 半球上から入射する光の総和を推測 –  8サンプル (レイ) – ライトに当たったサンプルは0でない値

Page 69: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

69 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

INDIRECT ILLUMINATION

} インダイレクトイルミネーション – 半球上から入射する光の総和を推測 –  8サンプル (レイ) – 物体に当たったサンプルは0でない値

} 表面から来る光はどのくらい?

??

Page 70: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

70 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

LIGHT FROM SURFACE

} 表面から届く光はダイレクトイルミネーションの計算と同じように行うことができる

We were solving this We want to solve this

Page 71: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

71 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

SOLUTION 1

} 8サンプル (レイを飛ばす) } 8サンプルの値の重み付け和を求める

} .

} 欠点 – キャストするレイの数が急激に増加

•  レイの総数 = プライマリレイの数 x 8 x 8 •  高い解像度でのレンダリング •  アンチエイリアシング

–  2バウンド以上だとレイの数が指数関数的に増加 •  バウンドの多いレンダリングに不向き

wi = π8

Lo(ωo) ≈ ∑π8 f (x, n, ωi)Li(ωi)cos(n, ωi)

Lo(ωo) ≈ ∑π8 f (x, n, ωi)Li(ωi)cos(n, ωi)

Page 72: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

72 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

SOLUTION 1

} 1サンプル } その値だけを用いて光の総和を推定

} .

} 利点 – 飛ばすレイの数が少ない – バウンドの多いレンダリングに向いている

} 欠点 – ノイジーな結果 – ノイズを減らすため多くのサンプルを生成する必要がある

} 一般的なパストレーシング – レイのバウンドが終わるまで追っていく

Lo(ωo) ≈ ∑π8 f (x, n, ωi)Li(ωi)cos(n, ωi)

Lo(ωo) ≈ π1 f (x, n, ωi)Li(ωi)cos(n, ωi)

wi = π1

Page 73: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

OTHER EFFECTS

Page 74: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

74 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

SO FAR

} Monte Carlo Integrationを半球上の入射光の積分に用いた

} Monte Carlo Integrationを他の積分に用いる – レンズ – 時間

Page 75: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

75 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

OTHER EFFECTS

Depth of Field (Integrate over lens) Motion blur (Integrate over time)

Page 76: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

OPENCL

Page 77: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

77 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MC RT IS SLOW!

} Computation takes a long time – Monte Carlo ray tracing need to cast a lot of rays/pixel

} Slow iteration –  Inefficient development – Cannot test a lot

} If we can make it faster, we can –  Test more

•  Software reliability – Go further

•  Better algorithm

} Computer history == Make it faster!

} Options – Algorithm improvement – Exploit hardware

Page 78: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

78 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

WHY OPENCL?

} Using OpenCL is equivalent to – Efficient usage of computational resources – Use GPU – Use multi-core CPU more efficiently

} GPU has high peak performance – AMD Radeon HD 7970 (GCN Architecture)

•  3.8 TFLOPS (S) •  974 GFLOPS (D) •  264 GB/s

– Parallel computation •  128 SIMD engines

–  64 wide SIMD

Page 79: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

79 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

OPENCL

} Open Compute Language (OpenCL) for parallel processors (including GPU) } OpenCL 1.0 specification released in 2008 } Now v1.2 } ISO C99 with extensions and restrictions

} Software portability – Cross platform support

•  Windows, Mac, Linux – Multi device support

•  GPU –  AMD, NVIDIA, Intel

•  CPU •  etc

– Write once, run on all the supported

} Direct Compute – Need DX – GPU only

Page 80: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

80 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

CPU VECTOR ADD

} CPU code is simple

float* a = new float[n]; float* b = new float[n]; float* c = new float[n]; for(int i=0; i<n; i++) { b[i] = i; c[i] = n; } for(int i=0; i<n; i++) { a[i] = b[i] + c[i]; } delete [] a; delete [] b; delete [] c;

Memory allocation

Initialization

Computation

Memory deallocation

Page 81: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

81 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

TO IMPLEMENT USING OPENCL

} Need to do 3 things 1.  OpenCL memory has to be allocated, deallocated

2.  Computation has to be written as OpenCL kernel 3.  OpenCL kernel has to be executed via OpenCL APIs

Page 82: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

82 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MEMORY ALLOCATION/DEALLOCATION

} CPU – Allocation

– Deallocation

} OpenCL – Allocation

– Deallocation

float* a = new float[n];

delete [] a;

cl_mem a = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float)*n, 0, &e );

clReleaseMemObject( a );

Memory size in byte

Page 83: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

83 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

COMPUTE USING OPENCL KERNEL

} CPU –  n items are executed in serial

} OpenCL

–  n items are executed in parallel – A work item processes an item – Write program (OpenCL Kernel) for a work item – Not in the host C code

for(int i=0; i<n; i++) { a[i] = b[i] + c[i]; }

__kernel void addKernel( __global float* a, __global float* b, __global float* c ) { int i = get_global_id(0); a[i] = b[i] + c[i]; }

__global : for a memory allocated in global memory __local : for a memory allocated in local memory

Can use the code for computations in this pattern

Page 84: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

84 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

EXECUTE OPENCL KERNEL

} Set OpenCL memories as arguments – Specify the index of the argument

} Execute kernel

clSetKernelArg(kernel1, 0, sizeof(cl_mem), (void*)&a); clSetKernelArg(kernel1, 1, sizeof(cl_mem), (void*)&b); clSetKernelArg(kernel1, 2, sizeof(cl_mem), (void*)&c);

clEnqueueNDRangeKernel( queue, kernel1, 1, 0, gSize, lSize, 0, 0, 0 );

__kernel void addKernel( __global float* a, __global float* b, __global float* c ) { int i = get_global_id(0); a[i] = b[i] + c[i]; }

Order of an argument

Work group size [64, 1, 1]

Global work size [n,1,1]

Page 85: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

85 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

OPENCL VECTOR ADD

__kernel void initKernel( __global float* b, __global float* c ) { int i = get_global_id(0); b[i] = i; c[i] = i; } __kernel void addKernel( __global float* a, __global float* b, __global float* c ) { int i = get_global_id(0); a[i] = b[i] + c[i]; }

cl_mem a = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float)*n, 0, &e ); cl_mem b = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float)*n, 0, &e ); cl_mem c = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float)*n, 0, &e ); clSetKernelArg(kernel0, 0, sizeof(cl_mem), (void*)&b); clSetKernelArg(kernel0, 1, sizeof(cl_mem), (void*)&c); clEnqueueNDRangeKernel( queue, kernel0, 1, 0, gSize, lSize, 0, 0, 0 ); clSetKernelArg(kernel1, 0, sizeof(cl_mem), (void*)&a); clSetKernelArg(kernel1, 1, sizeof(cl_mem), (void*)&b); clSetKernelArg(kernel1, 2, sizeof(cl_mem), (void*)&c); clEnqueueNDRangeKernel( queue, kernel1, 1, 0, gSize, lSize, 0, 0, 0 ); clReleaseMemObject( a ); clReleaseMemObject( b ); clReleaseMemObject( c );

Memory allocation

Initialization

Computation

Memory deallocation

Page 86: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

86 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

CODE COMPARISON

CPU OpenCL

float* a = new float[n]; float* b = new float[n]; float* c = new float[n]; for(int i=0; i<n; i++) { b[i] = i; c[i] = n; } for(int i=0; i<n; i++) { a[i] = b[i] + c[i]; } delete [] a; delete [] b; delete [] c;

cl_mem a = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float)*n, 0, &e ); cl_mem b = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float)*n, 0, &e ); cl_mem c = clCreateBuffer( context, CL_MEM_READ_WRITE, sizeof(float)*n, 0, &e ); clSetKernelArg(kernel0, 0, sizeof(cl_mem), (void*)&b); clSetKernelArg(kernel0, 1, sizeof(cl_mem), (void*)&c); clEnqueueNDRangeKernel( queue, kernel0, 1, 0, gSize, lSize, 0, 0, 0 ); clSetKernelArg(kernel1, 0, sizeof(cl_mem), (void*)&a); clSetKernelArg(kernel1, 1, sizeof(cl_mem), (void*)&b); clSetKernelArg(kernel1, 2, sizeof(cl_mem), (void*)&c); clEnqueueNDRangeKernel( queue, kernel1, 1, 0, gSize, lSize, 0, 0, 0 ); clReleaseMemObject( a ); clReleaseMemObject( b ); clReleaseMemObject( c );

Memory allocation

Initialization

Computation

Memory deallocation

Page 87: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

87 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

IMPLEMENT DIRECT LIGHTING

} Generate ray } Cast ray

} Generate sample ray } Cast shadow ray

} Accumulate result

Page 88: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

88 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

SINGLE KERNEL IMPLEMENTATION

} Describe everything in a kernel

} Pros – Easy to implement

•  Straightforward port from CPU implementation

} Cons – Poor HW utilization – Divergence – Register pressure

Host: executeKernel(SingleKernel); Device: __kernel void SingleKernel() { while( i < maxSamples ) { GenerateRay(); CastRay(); if( hit ) { GenerateSampleRay(); CastShadowRay(); AccumulateResult(); } } }

Page 89: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

89 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

DIVERGENCE

} 1st – Generate Ray – Cast Ray – Generate Sample Ray – Cast Shadow Ray – Accumulate Result

Page 90: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

90 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

MULTIPLE KERNEL IMPLEMENTATION

} Split the pipeline into multiple kernels

} Pros – Better HW utilization – More room for optimization

} Cons – Need more work than single kernel implementation – Host has to queue more OpenCL commands – Each kernel has to read/write ray info

Host: while( i < maxSamples ) { executeKernel(RayGenerationKernel); executeKernel(RayCastKernel); executeKernel(SampleRayKernel); executeKernel(RayCastKernel); executeKernel(AccumulationKernel); } Device: __kernel void RayCastKernel() { }

Page 91: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

91 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

DIVERGENCE

} 1st – Generate Ray – Cast Ray – Generate Sample Ray – Cast Shadow Ray – Accumulate Result

Page 92: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

92 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

DIVERGENCE 2 BOUNCES

} 1st – Generate Ray – Cast Ray – Generate Sample Ray – Cast Shadow Ray – Accumulate Result

} 2st – Generate Ray – Cast Ray – Generate Sample Ray – Cast Shadow Ray – Accumulate Result

Page 93: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

93 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

DIVERGENCE

} 1st – Generate Ray – Cast Ray – Generate Sample Ray – Cast Shadow Ray – Accumulate Result

} 2st – Generate Ray – Cast Ray – Generate Sample Ray – Cast Shadow Ray – Accumulate Result

Page 94: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

94 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

TIPS

} Starting – Single kernel implementation – Share data types with host (float4)

•  Easy to share functions – Replace pointers to indices

} Debugging – Printf – Debug buffers

} Others – Cache compiled kernel

•  Reduce compilation time

Coumans, E., Multithreading and VFX Course note, SIGGRAPH 2013

Page 95: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

95 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

EXAMPLES

} All figures in this presentation are generated by an OpenCL renderer – Radeon HD 7970

Page 96: Introduction to Monte Carlo Ray Tracing (CEDEC 2013)

96 モンテカルロレイトレーシングの基礎からOpenCLによる実装まで | AUG, 2013

WHAT IS COVERED

} BRDF – Reflection, refraction, glossy, matt

} Fresnel

} Monte Carlo Integration – Direct Illumination –  Indirect Illumination

} Importance Sampling –  Light sampling – BRDF sampling

} Layered Materials

} OpenCL Introduction } Tips for OpenCL implementation