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
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
都市スケールAR制作で気をつけること
segur
0
200
信頼性が求められる業務のAIAgentのアーキテクチャ設計の勘所と課題
miyatakoji
0
150
大規模プロダクトで実践するAI活用の仕組みづくり
k1tikurisu
5
1.8k
自然言語でAPI作業を片付ける!「Postman Agent Mode」
nagix
0
140
AI開発の定着を推進するために揃えるべき前提
suguruooki
1
140
未回答質問の回答一覧 / 開発をリードする品質保証 QAエンジニアと開発者の未来を考える-Findy Online Conference -
findy_eventslides
0
410
Building AI Applications with Java, LLMs, and Spring AI
thomasvitale
1
230
Pandocでmd→pptx便利すぎワロタwww
meow_noisy
2
910
Dev Containers と Skaffold で実現する クラウドネイティブ開発環境 ローカルのみという制約に挑む / Cloud-Native Development with Dev Containers and Skaffold: Tackling the Local-Only Constraint
bitkey
PRO
0
130
AWS re:Invent 2025 で頻出の 生成 AI サービスをおさらい
komakichi
3
220
小規模チームによる衛星管制システムの開発とスケーラビリティの実現
sankichi92
0
130
なぜブラウザで帳票を生成したいのか どのようにブラウザで帳票を生成するのか
yagisanreports
1
200
Featured
See All Featured
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
Building Applications with DynamoDB
mza
96
6.8k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
How to Ace a Technical Interview
jacobian
280
24k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
Why Our Code Smells
bkeepers
PRO
340
57k
YesSQL, Process and Tooling at Scale
rocio
174
15k
What's in a price? How to price your products and services
michaelherold
246
12k
Fireside Chat
paigeccino
41
3.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
54k
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