Slide 1

Slide 1 text

No content

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

! () " () 散乱係数[1/m] 吸収係数[1/m] 散乱しやすさ 吸収しやすさ 一様媒質と違う点 これらのパラメータが空間的に変化する (xに依存して変化する)

Slide 4

Slide 4 text

非一様媒質であることによる弊害 , = ! ∫! " ## $!%& '% 透過率の解析的な評価が難しい。 距離サンプリングに必要な逆関数法も使えない。 ! ≔ " + #()

Slide 5

Slide 5 text

いくつかの解決策 ・デルタトラッキング ・レイマーチング ここではデルタトラッキングについて解説していく

Slide 6

Slide 6 text

デルタトラッキング & ∇ , = −! , + " # , + / $! % & , ' , ' ' まず、媒質中での放射輝度の変化を記述した放射伝達方程式(RTE)は 吸収・散乱による放射輝度の減少 発光による放射輝度の増加 散乱による放射輝度の増加 通常のボリュームレンダリング方程式はこの微分方程式を解くことで得られる。 そこで、この式の持つ意味を変えないで扱いやすい形に変形していくことを考える。 ※微分方程式の解き方はmemoRANDOMを参照してください。

Slide 7

Slide 7 text

デルタトラッキング そこで、衝突してきたレイの方向を変えず散乱させるような擬似的な粒子を導入する。 この衝突をnull-collisionと呼ぶ。

Slide 8

Slide 8 text

デルタトラッキング null-collisionによる放射輝度の変化は次のようになる −( , + ( / $! − ' , ' ' = 0 ! ()は" ()や# ()の役割と同様に、上の擬似的な散乱の起こりやすさを表す係数である。 減少 増加

Slide 9

Slide 9 text

デルタトラッキング −( , + ( / $! − ' , ' ' = 0 先ほど出てきた次の式 これを放射伝達方程式に加えても意味は変わらないことは明らかですね & ∇ , = −! , + " # , + / $! % & , ' , ' ' − ( , + ( ∫ $! − ' , ' '

Slide 10

Slide 10 text

デルタトラッキング 5 ! ≔ !() + (()とすれば、次のように書ける & ∇ , = −5 ! , + # $ , + + %! " & , ' , ' ' + ( + %! − ' , ' '

Slide 11

Slide 11 text

デルタトラッキング この微分方程式を解けば、null-collisionを考慮したボリュームレンダリング方程式を得ます。 , = 1 $ % 2 , 2 & # 2 & ' , + " 2 & 1 (! ) , * , * * + ! 2 & (, ) + 2 , (, ) 5 , ≔ : ∫ " # < =$ >:%? @%

Slide 12

Slide 12 text

デルタトラッキング ここで、 2 & ()の定義に戻れば、 ! ! ≔ ! () + " () ! ()の定め方は自由なので、 2 & が定数Cになるように! ()を定めれば、 ! , ≔ 0 ∫! " 2 3# 045 64 = 0 ∫! " 7 64= 078 透過率が解析的に求まっている!!(null-collisionを経路に組み込んだ上での透過率であることに注意) ちなみに定数Cは& ()の最大値に設定することが多い

Slide 13

Slide 13 text

デルタトラッキング また距離サンプリングに使う確率変数の分布関数は、 = 1 − ! (, ) = 1 − #$% これは逆関数法が適用でき、 = −log(1 − u) 非一様媒質を一様媒質のように扱うことができるようになった

Slide 14

Slide 14 text

デルタトラッキング 以上の内容から、nullな粒子が一様でない媒質を一様化させていることがわかる

Slide 15

Slide 15 text

デルタトラッキング モンテカルロ積分の推定値は次のようになる。 , = 2 +#, ≥ +#, , = 2 +#, 2 +#, , = , (" ≥ +#, ) , (" < +#, ) " ≔ 距離サンプリングで求めた値 , ≔ - . &" / 0# , 0$ , / 0# , ) &" 0$ , / 0# , 1% ,,3 4 - . &" / 0# , 0$ , / 0# , - . &" / 0# , 0$ , / 0# , 1% ,,3 41% ,,3 5&(3,3')- . &" / 0# , 0" , / 0# , )(3')) &" 0" , / 0# , 1 ,,3' 4 5&(3,3')- . &" / 0# , 0" , / 0# , 5&(3,3')- . &" / 0# , 0" , / 0# , 1 ,,3' 41 ,,3' 8(393)- . &" / 0# , 0" , / 0# , 8(393)) &" 0" , / 0# , 1 ,,3 4 - . &" / 0# , 0" , / 0# , - . &" / 0# , 0" , / 0# , 1 ,,3 41(,,3) ≔ 境界上の点 (吸収) (散乱) (null-collision)

Slide 16

Slide 16 text

実際のレイトレースの流れ

Slide 17

Slide 17 text

レイがボリュームの境界である直方体にヒットする ※なんで直方体なのかは後で説明します!

Slide 18

Slide 18 text

境界情報を取得する : $

Slide 19

Slide 19 text

距離サンプリング 4 = 9 − log(1 − ) $ :

Slide 20

Slide 20 text

距離サンプリング 4 ≥ : のときは、 そのまま通過 $ : "

Slide 21

Slide 21 text

$ : " 現在の点での、密度データ(%, ", ( )の取得

Slide 22

Slide 22 text

$ : " 散乱・吸収・null-collisionのどれが起きるかを確率的に決める =% < =$ + =& < =$ + =' < =$ = 1 なので、 確率 =% < =$ で、吸収・発光 確率 =& < =$ で、散乱 確率 =' < =$ で、null-collision

Slide 23

Slide 23 text

$ : " 吸収イベントが起こるとき 発光のある媒質(火、爆発など)なら、 return Throughput × ' (, ) 発光のない物質なら、 return Throughput × 0

Slide 24

Slide 24 text

$ : " 散乱イベントが起こるとき 散乱方向をサンプリングして、 そして、ループの最初に戻る 次に飛ばすレイを設定する。

Slide 25

Slide 25 text

$ : " null-collisionイベントが起こるとき レイの方向を変えず、 レイの始点だけを現在の点に変えて、 ループの最初に戻る。

Slide 26

Slide 26 text

格子点に、密度データを格納する。ボリューム境界が直方体であることの理由はこれ。 (実際は3Dだが簡単のために2Dで書いている) データの表現方法

Slide 27

Slide 27 text

データの表現方法 の順番で線形補間していく 任意の点での密度データを取得するときは、補間を用いる。 上の図はトリリニア補間。

Slide 28

Slide 28 text

以上のことを実装すると

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

NanoVDB

Slide 34

Slide 34 text

・CUDAでVDBを扱うためのNVIDIA謹製のライブラリ ・外部ライブラリへの依存が少ない! ・ヘッダーオンリー

Slide 35

Slide 35 text

・vdbファイルを変換したnvdbファイルを使う。 使い方 ・まずはグリッドデータの読み込み

Slide 36

Slide 36 text

使い方 ・GPU側へのグリッドデータのアロケーション

Slide 37

Slide 37 text

使い方 デバイスメモリ上のグリッドデータは、 ホストメモリ上のグリッドデータは、

Slide 38

Slide 38 text

使い方 ・NanoVDBはボリュームの境界であるAABBとレイの交差判定もやってくれる。

Slide 39

Slide 39 text

使い方 ・密度のデータを取得する際のトリリニア補間はこんな感じ

Slide 40

Slide 40 text

このような感じで、ボリュームレンダリングに必要なものは大体揃ってます!! みんなもNanoVDBでボリュームレンダリングに挑戦してみよう!!