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

Ray Tracing In One Hour

Ray Tracing In One Hour

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

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

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 秒ほどまで高速化した