Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ray Tracing In One Hour

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for prime number prime number
February 08, 2024

Ray Tracing In One Hour

KMC春合宿オンライン 2021夏で発表した内容です

レイトレーシングのチュートリアル"Ray Tracing In One Weekend"と続編の"Ray Tracing: The Next Week"の一部を元にしていますが、基礎的な部分の解説を入れたり、高速化についても取り扱っています

Avatar for prime number

prime number

February 08, 2024
Tweet

More Decks by prime number

Other Decks in Programming

Transcript

  1. 2 今日の内容 レイトレーシングのチュートリアル Ray Tracing in One Weekend https://raytracing.github.io/books/RayTracingInOneWeekend.html を参考に、アルゴリズムと実装に触れる

    最後の方は続編の Ray Tracing: The Next Week https://raytracing.github.io/books/RayTracingTheNextWeek.html の内容も一部取り扱ったり、これらの資料にないトピックも扱う
  2. 3 自己紹介 KMC-id: prime (37 代 ) a.k.a.そすうぽよ 社会人 3

    年目 Twitter: @_primenumber Web: https://poyo.me Mastodon: @[email protected] 計算機を作ったり壊したり、 使い倒したり
  3. 5 自己紹介 (VRChat) 最近はバーチャルの世界で遊んでいます シェーダーを書いて、他プレイヤーの GPU で計算できる! シェーダー : 3DCG

    で描画される内容を計算する、 GPU 上で動くプログラム 作例: ライフゲームのシミュレーション Brainf*ckインタプリタ 汎用並列計算機 GPU パーティクル ※ 用法容量を守ってお使いください
  4. 13 3 次元ベクトル (vec3) レイの方向等を表現するのに使う x,y,z の各次元に対応する実数値を持てばいい ここでは長さ 3 の配列で持つことにする

    struct vec3 { double e[3]; }; 座標 (x,y,z) や色 (R,G,B) も同様(流用してもよい) point3 , color としておく
  5. 18 点と球の内外判定 レイ(半直線)と球の衝突判定の準備 点 P と球 S( 中心 C, 半径

    r) の内外判定は、     でできる 引き算は、座標をベクトルとして演算、  で v の長さを表す 三次元なので、 sqrt は重い計算なので、しばしば両辺二乗を取って 内積で書くと ‖P−C‖≤r ‖v‖ ‖v‖=√v x 2+v y 2 +v z 2 ‖P−C‖2≤r2 (P−C)⋅(P−C)≤r2
  6. 19 レイと球の衝突判定 レイ上のある点が球の内側になるかどうかを判定すればよい レイ上の点をパラメータ t を用いて  と書くと、 ある t について           となるかが知りたい レイの始点

    A と方向 b を用いて、     と分解できるので、 内積は通常の積のように分配法則が成り立つので、 内積はスカラー値になるので、これは t の二次不等式になる 衝突判定だけでよければ、判別式の符号を見ればよい 衝突する点を求めたい場合は、二次方程式を解けばよい P(t) (P(t)−C)⋅(P(t)−C)≤r2 P(t)=A+t b (A+t b−C)⋅( A+t b−C)≤r2 t2 b⋅b+2t b⋅(A−C)+( A−C)⋅(A−C)≤r2
  7. 36 球面上一様分布の作成 様々な方法があるが、簡単な方法として、 1.[-1,1]の一様乱数を 3 個生成する 2.これが半径 1 の単位球に収まっていないなら、 1

    に戻る 3.収まっているなら、この 3 次元ベクトルを正規化する(自身の長 さで割る) ステップ 1,2 の繰り返しは十分少ない回数で終わることが期待でき る( 1 回の試行で成功する確率は 1/2 より大きい)
  8. 37 球面一様分布の他の作り方 xy-座標と z 座標に分けて考える z 座標で球を輪切りにするイメージ z 座標は実は [-1,1]上の一様分布になる

    xy-座標は半径   の円周上から一様に選べばよい 半径 r の円周上から一様に選ぶのは、 [0,1) 上の一様乱数 u から とすればよい √1−z2 x=r cos(2π u), y=rsin(2 π u)
  9. 52 カメラの移動 ここまで「カメラ」は完全に固定されていた 位置は座標系の原点 (0,0,0 ) にあった 視点の向きは z 軸負の方向

    視野は上下方向が (x,1,-1) から (x,-1,-1) がぴったり見える範囲 せっかくなので動かせるようにする
  10. 69 Bounding Volume Hierarchy の実装 適当に分割すると、 bounding boxの重なりが増え、効率が悪い 上手い分割方法で論文や本が書けてしまうレベル https://shin

    jiogaki.github.io/b vh/ とかを眺めると面白い ここでは x/y/z 軸から一つ選んで座標でソートして分割する実装に
  11. 70 BVH の効果 適当に実装したところ、 1 分半ほどに ( 約 1.5 倍速

    ) bounding boxとの衝突判定が支配的なので、ここをチューニング グループ分割も多少工夫 これらの改善で、 33 秒ほどまで高速化した