$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
レイマーチング入門
Search
antenna_three
December 13, 2019
Technology
0
2.1k
レイマーチング入門
UTMC (
http://www.komaba.utmc.or.jp/
) にて行ったプレゼンテーションです。
ラスタライズ、レイトレーシング、レイマーチングの仕組みについて解説しました。
antenna_three
December 13, 2019
Tweet
Share
More Decks by antenna_three
See All by antenna_three
GitHub Actionsで学ぶCI/CD
antenna_three
0
36
Djangoで動的サイトを作ろう
antenna_three
0
1.1k
ビットボード解説
antenna_three
1
3.2k
シェーダで学ぶ画像フィルタ
antenna_three
0
2k
PythonによるWebスクレイピング入門
antenna_three
0
1.8k
ゲーム制作概論
antenna_three
0
2k
Other Decks in Technology
See All in Technology
「え?!それ今ではHTMLだけでできるの!?」驚きの進化を遂げたモダンHTML
riyaamemiya
10
4.4k
AIにおける自由の追求
shujisado
3
470
こがヘンだよ!Snowflake?サービス名称へのこだわり
tarotaro0129
0
110
原理から解き明かす AIと人間の成長 - Progate BAR
teba_eleven
2
300
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
37k
Digitization部 紹介資料
sansan33
PRO
1
6.1k
eBPFとwaruiBPF
sat
PRO
2
930
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.3k
Design System Documentation Tooling 2025
takanorip
1
930
Playwrightのソースコードに見る、自動テストを自動で書く技術
yusukeiwaki
2
720
Noを伝える技術2025: 爆速合意形成のためのNICOフレームワーク速習 #pmconf2025
aki_iinuma
2
1k
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
3
21k
Featured
See All Featured
Visualization
eitanlees
150
16k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
690
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
37
2.6k
Reflections from 52 weeks, 52 projects
jeffersonlam
355
21k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
A better future with KSS
kneath
240
18k
Six Lessons from altMBA
skipperchong
29
4.1k
Transcript
レイマーチング入門
目次 ラスタライズ グラフィックスパイプライン GLSL レイトレーシング レイマーチング マーチングループ 距離関数
3Dレンダリングの手法 大きく分けて • ラスタライズ • レイトレーシング の2つ レイマーチングはレイトレーシングの1種
ラスタライズの流れ (グラフィックスパイプライン) 1. 入力 2. 頂点パイプライン 各頂点の位置や色を計算、投影面に投影 3. ラスタライズ 頂点の集合をピクセルの集合に変換
4. ピクセルパイプライン 各ピクセルの色を計算 5. 出力
入力 ポリゴン、テクスチャ、マッピング、法線など
頂点パイプライン 透視投影 - Wikipedia
ラスタライズ 頂点の持つパラメーターをピクセルごとに線形補間
ピクセルパイプライン ピクセルの位置と線形補間されたパラメータからピクセルの色などを決定
グラフィックスパイプラインの処理対象は膨大 最大で数千万個の頂点を数百万個のピクセルに描画する これらの処理を並列実行するのがGPU
GPU (Graphics Processing Unit) グラフィックスパイプラインを処理することに特化したプロセッサ 性能を抑えたコアを大量に搭載して並列実行
OpenGL (Open Graphics Library) グラフィックスパイプラインに入力を行うためのAPI Unix, Linux, Windows, Mac, Android,
iPhoneで使える ただしAppleはOpenGLを非推奨に (f**k) かつてはDirect3D (WindowsのグラフィックスAPI) に後れを取っていたが、 現在では遜色なく使える
シェーダー グラフィックスパイプラインの一部を担うプログラム 頂点シェーダー 頂点パイプラインの一部 座標変換・頂点ごとの陰影処理などを担う フラグメントシェーダー ピクセルパイプラインの一部 ピクセルの色付け・ピクセルごとの陰影処理などを担う
GLSL (OpenGL Shader Language) OpenGLに含まれる、シェーダーを記述するためのプログラミング言語 C言語をベースとした高級言語 行列演算・ベクトル演算向けの機能が豊富
GLSLだけで描画する raymarching.pdeを実行 mandelbrot.glslが内部で実行される ここでGLSLのキホンをがんばって話す
ラスタライズの欠点 陰影表現には優れているが、光の反射・屈折などの光学現象の再現が難しい 環境マッピング・シャドウマッピングなどで擬似的に再現 描画負荷が頂点数に依存するので複雑な図形の描画が重い
レイトレーシング 視点に入る光を逆にたどって、その先にある物体を描画する この光線を「レイ」と呼ぶ 光の反射や屈折を再現できるので、リアルな描画ができる
レイトレーシングの欠点 描画負荷が非常に高い 数百万の光線を飛ばして物体との当たり判定や反射・屈折の処理を行う 反射回数を増やすとさらに光線が増える 物体の形状ごとに当たり判定が必要 球や直方体などのプリミティブなら容易だが複雑な形状は苦手
レイマーチング 距離関数という関数で物体の形状を定義 レイと物体の交点を解析的でなく数値的に求める 距離関数で定義できるなら複雑な形状も表現できる
数値的にレイを進める 進む距離が短いと物体に 当たるまで時間がかかる
数値的にレイを進める 進む距離が長いと物体を 貫通するかもしれない
数値的にレイを進める このあたりは一気にレイを進めたい ↓ ↑ このあたりは少しずつレイを進めたい
数値的にレイを進める 一番近い物体の、一番近い点までの 距離進めば無駄がないし貫通しない
数値的にレイを進める 「物体の一番近い点までの距離」が 分かれば「一番近い物体」も 自動的に分かる
距離関数 物体Objの距離関数 distObj(pos) とは、点posからObjまでの最短距離である
レイマーチング レイを距離関数の長さだけ進めることを繰り返し (マーチング・ループ) 、 距離関数が十分0に近づいたら レイが物体に当たったとみなす
球の距離関数 中心(0, 0, 0), 半径rの球Sphereの距離関数distSphere(pos)は distSphere(pos) = length(pos) - r
で表される
球の距離関数 dist(pos) = length(pos) - r
直方体の距離関数 中心 (0, 0, 0), 3辺の長さが 2 * b の直方体の距離関数distBox(pos)は
distBox(pos) = length(max(abs(pos) - b, 0)) で表される
直方体の距離関数 dist(pos) = length(max(abs(pos) - b, 0))
和集合 distObj1(pos) で表される立体 Obj1 と distObj2(pos) で表される立体 Obj2 の 和集合
Obj1 ∪ Obj2 は Obj1 ∪ Obj2 = min(distObj1, distObj2) で表される
積集合 distObj1(pos) で表される立体 Obj1 と distObj2(pos) で表される立体 Obj2 の 積集合
Obj1 ∩ Obj2 は Obj1 ∪ Obj2 = max(distObj1, distObj2) で表される
差集合 distObj1(pos) で表される立体 Obj1 から distObj2(pos) で表される立体 Obj2 を 除いた差集合
Obj1 - Obj2 は Obj1 - Obj2 = max(distObj1, -distObj2) で表される
差集合の仕組み
複製 distObj(pos)で表されるObjを間隔periodで 無限に繰り返す距離関数は distObj(pos’) pos’ := mod(pos, period) - period/2
回転 distObj(pos)で表されるObjをnのまわりにθ回転させた距離関数は distObj(Rn(θ) × pos) ロドリゲスの回転公式 - Wikipedia
シェーディング Obj上の点posにおけるObjの法線nは n = ∇distObj(pos) で表される
メンガーのスポンジを作ってみよう
References wgld.org | GLSL https://wgld.org/d/glsl/ Inigo Quilez | distance functions
http://iquilezles.org/www/articles/distfunctions/distfunctions.htm