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
Application Development WG Intro at AppDeveloperCon
salaboy
0
200
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
1
450
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
0
110
組織成長を加速させるオンボーディングの取り組み
sudoakiy
2
220
Amazon CloudWatch Network Monitor のススメ
yuki_ink
1
210
生成AIが変えるデータ分析の全体像
ishikawa_satoru
0
170
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
520
アプリエンジニアのためのGraphQL入門.pdf
spycwolf
0
100
AI前提のサービス運用ってなんだろう?
ryuichi1208
8
1.4k
The Rise of LLMOps
asei
8
1.7k
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
120
AWS Lambdaと歩んだ“サーバーレス”と今後 #lambda_10years
yoshidashingo
1
180
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
4
130
Building Adaptive Systems
keathley
38
2.3k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
Being A Developer After 40
akosma
87
590k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
A better future with KSS
kneath
238
17k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.7k
Navigating Team Friction
lara
183
14k
Raft: Consensus for Rubyists
vanstee
136
6.6k
The Art of Programming - Codeland 2020
erikaheidi
52
13k
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