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
23
Djangoで動的サイトを作ろう
antenna_three
0
750
ビットボード解説
antenna_three
0
2.6k
シェーダで学ぶ画像フィルタ
antenna_three
0
2k
PythonによるWebスクレイピング入門
antenna_three
0
1.8k
ゲーム制作概論
antenna_three
0
2k
Other Decks in Technology
See All in Technology
なにもしてないのにNew Relicのデータ転送量が増えていたときに確認したこと
tk3fftk
2
230
Envoy External AuthZとgRPC Extensionを利用した「頑張らない」Microservices認証認可基盤
andoshin11
0
250
OCI で始める!! Red Hat OpenShift / Get Started OpenShift on OCI
oracle4engineer
PRO
1
180
DuckDB雑紹介(1.1対応版)@DuckDB座談会
ktz
6
1.4k
OSTという文化を組織に根付かせてみた
sansantech
PRO
2
390
テスト”ケース”駆動開発 で手戻りをなくそう
ryohma0510
0
320
『GRANBLUE FANTASY Relink』ソフトウェアラスタライザによる実践的なオクルージョンカリング
cygames
0
170
『GRANBLUE FANTASY: Relink』最高の「没入感」を実現するカットシーン制作手法とそれを支える技術
cygames
1
140
o1のAPIで実験してみたが 制限きつすぎて辛かった話
pharma_x_tech
0
200
たった1人からはじめる【Agile Community of Practice】~ソース原理とFearless Changeを添えて~
ktc_corporate_it
1
480
Mocking in Rust Applications
taiki45
2
410
OR学会2024秋_短期収益と将来のオフ方策評価性能を考慮したクーポン割当方策混合比の決定
recruitengineers
PRO
4
460
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
325
38k
How STYLIGHT went responsive
nonsquared
93
5.1k
A Modern Web Designer's Workflow
chriscoyier
691
190k
Build your cross-platform service in a week with App Engine
jlugia
228
18k
Facilitating Awesome Meetings
lara
49
6k
Making the Leap to Tech Lead
cromwellryan
128
8.8k
GraphQLの誤解/rethinking-graphql
sonatard
65
9.8k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
24
610
Side Projects
sachag
451
42k
Done Done
chrislema
180
16k
Code Review Best Practice
trishagee
62
16k
From Idea to $5000 a Month in 5 Months
shpigford
379
46k
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