Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
レイマーチング入門
Search
antenna_three
December 13, 2019
Technology
0
1.9k
レイマーチング入門
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
24
Djangoで動的サイトを作ろう
antenna_three
0
820
ビットボード解説
antenna_three
1
2.7k
シェーダで学ぶ画像フィルタ
antenna_three
0
2k
PythonによるWebスクレイピング入門
antenna_three
0
1.8k
ゲーム制作概論
antenna_three
0
2k
Other Decks in Technology
See All in Technology
Zennのパフォーマンスモニタリングでやっていること
ryosukeigarashi
0
100
エンジニア人生の拡張性を高める 「探索型キャリア設計」の提案
tenshoku_draft
1
130
Platform Engineering for Software Developers and Architects
syntasso
1
520
組織成長を加速させるオンボーディングの取り組み
sudoakiy
2
170
TypeScript、上達の瞬間
sadnessojisan
46
13k
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
6
650
これまでの計測・開発・デプロイ方法全部見せます! / Findy ISUCON 2024-11-14
tohutohu
3
370
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
490
Making your applications cross-environment - OSCG 2024 NA
salaboy
0
190
[CV勉強会@関東 ECCV2024 読み会] オンラインマッピング x トラッキング MapTracker: Tracking with Strided Memory Fusion for Consistent Vector HD Mapping (Chen+, ECCV24)
abemii
0
220
複雑なState管理からの脱却
sansantech
PRO
1
150
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
660
Featured
See All Featured
Designing for humans not robots
tammielis
250
25k
Automating Front-end Workflow
addyosmani
1366
200k
Thoughts on Productivity
jonyablonski
67
4.3k
Into the Great Unknown - MozCon
thekraken
32
1.5k
It's Worth the Effort
3n
183
27k
Raft: Consensus for Rubyists
vanstee
136
6.6k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Agile that works and the tools we love
rasmusluckow
327
21k
The World Runs on Bad Software
bkeepers
PRO
65
11k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
What's in a price? How to price your products and services
michaelherold
243
12k
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