Imaginantia

思ったことを書きます

Sphere Tracing Reformulated

特に理由は無いけどSphereTracingについて考えてみる。内容は書きながら考えている。

fragment shader

描画領域の各点に対して色を返すことで絵を作ることができる fragment shader は、その性質のまま \mathsf{Screen} \to \mathsf{Color} と捉えられる。 特に \mathsf{Screen} が長方形であるという条件の元で \mathsf{Screen} = [-w/2,w/2]\times[-h/2,h/2] である。 空間の形にだけ注目して I = [0,1] とすれば \mathsf{Screen} = I^2 で、ついでに \mathsf{Color} = I^4 である。

なので fragment shader は本質的に I^2 \to I^4 みたいなところがあるわけだが、そこまで覗き込む必要は無い。\mathsf{Screen} が点の集まりであるだけで十分だろう。

ray

風景というものを考えるとき、自然と視点の存在が生まれる。ある視点から見える風景は S^2 = \{p\colon\mathbb{R}^3\mid |p| = 1\} の上にあるので、先程の I^2 は一度 S^2 に埋め込むことになる。 私達の考えているスクリーンは z = \alpha 平面にあり、視点の存在によって同一視される点の集まりの中で S^2 と交わる領域を取ることを考えれば (x,y) \mapsto \lVert(x,y,\alpha)\rVert\colon I^2 \hookrightarrow S^2 として「視線」を得ることが出来る。

よって次は視線 S^2 に対して \mathsf{Color} を返す写像を構成すれば良い。

volume and distance field

一旦話を変えて3次元空間上の物体の表現について考える。物が空間にあるということについて考えてみればまず \mathbb{R}^3 \to \mathbf{2} が出てくるが、これでは完全に「ある一点」についての情報しかわからない。本当は空間は「つながっている」ので、欠落の結果として \mathbf{2} = \{\mathsf{false}, \mathsf{true}\} が出てくる方がうれしい。自然な拡張として \mathsf{2}\mathbb{R} に持ち上げ x \mapsto x \lt 0 \colon \mathbb{R} \to \mathbf{2} で落とす方法が考えられる。\mathbb{R}^3 \to \mathbb{R} と言えばこれはスカラーである。

その中でも最もよく使われているのが距離場、特にsigned distance fieldで、物体 f \colon\mathbb{R}^3 \to \mathbf{2} に対して次の方法で構成した写像を提供するものである。

\[ \hat{f}(p) = \displaystyle\begin{cases}\min\{d\gt 0 \mid \exists_{x\colon\mathbb{R}^3\text{ where }|p - x| \le d}\ f(x)\}&\text{if }\neg f(p)\\ -\min\{d\gt 0 \mid \exists_{x\colon\mathbb{R}^3\text{ where }|p - x| \le d}\ \neg f(x)\}&\text{if } f(p) \end{cases} \]

この写像は (非自明ながら) 連続 (なはず) で、まぁ定義はどうでも良いのだが、重要な性質として次がある (これは \mathrm{min} の性質から出る)。

\[ \hat{f}(p) \gt d \Longrightarrow \forall_{x\colon\mathbb{R}^3\text{ where }|p-x| \lt d}\ \neg f(x)\\ \hat{f}(p) \lt -d \Longrightarrow \forall_{x\colon\mathbb{R}^3\text{ where }|p-x| \lt d}\ f(x) \]

尚ここで d > 0\hat{f}(p) は点 p の情報だけでなくその周辺ある程度の情報も保持しており、特に半径 |\hat{f}(p)| 未満の領域には意味ある情報が存在しないことがわかる。 f から \hat{f} を導出するのは簡単なことではないが、はじめから \hat{f}\colon \mathbb{R}^3 \to \mathbb{R} が拾える可能性がある。\hat{f}(p) \lt 0 \Longleftrightarrow f(p) なので*1元の図形の情報の純粋な拡張としてこのスカラー場を捉えることができる。

例えば球 \{p\in\mathbb{R}^3 \mid |p| \lt 1\} に対して p \mapsto |p| \lt 1\colon \mathbb{R}^3 \to \mathbf{2} が提供できるが、更に  p\mapsto |p| - 1\colon \mathbb{R}^3 \to \mathbb{R} を与えることもできるわけである。

sphere tracing

ある視線方向に物が見えているとき、その見えている物の場所は最近衝突点であるはず。だから求めるべきは次。

\[ v \mapsto \min\{t\gt 0\mid f(vt) \} = \min\{t\gt 0\mid \hat{f}(vt) \lt 0\} \colon S^2 \to \mathbb{R} \]

最小値が欲しいので t=0 から調べていくことを考える。ある t に対して \hat{f}(vt) = d\ (d \gt 0) であることがわかるとき、先程の性質から \forall_{t'\colon\mathbb{R}\text{ where }|t'-t| \lt d}\ \neg f(vt') であることがわかる。つまり最小値の候補は t+d 以上にすることができる。これを繰り返せば d = 0 へ至り、このとき境界即ち最小値になっている、というのが sphere tracing である。

これは f を用いて点を拾っていくよりも圧倒的に正しい。何故なら x \mapsto x = 0 のような「小さな点」を見逃してしまうことが無いから。だけど側面をすり抜けるなどの d \gt \varepsilon みたいなケースだと d = 0 になる可能性が不安定で時間が掛かる。正しさと速度/制御可能性はだいたいトレードオフである。

normal

衝突がわかれば様々な計算ができ、色を算出することが可能になる。物体の色に関してはレンダリング方程式が基本的に正しいものの、まぁそこまで丁寧にやる必要は基本無い。というかできない。

なんであれ物体の色を決定するのに最も重要なのはきっと法線で、これは端的に言えば面の向き (なので S^2 に棲む) である。roughな物体や髮などに於いては法線は局所的に振動するので「ある法線 n\colon S^2」が在るとはなかなか言えないが、これらをモデル化する際にも結局は基本的な法線方向があってそこからの散乱具合で表したりする。

先程考えたdistance fieldベースでの物体表現では、法線は理論的にはすごい単純な概念になる。というのもよく知られた事実としてスカラー場の或る等高面上のある点に於いて、法線と勾配の向きが一致するという話がある。 \hat{f}(p) = 0 によって定まる等高面が求める図形の表面なわけで、つまり衝突点 p における法線は \lVert d\hat{f}(p) \rVert である。

では d\hat{f} がわかれば良く、局所的に \hat{f} が線形であると仮定すれば \hat{f}(p+e) = \langle e,n\rangle となるので n を求める為には3点くらいあれば十分に見える*2。 そこで e \in \{(1,0,0),(0,1,0),(0,0,1)\} を取ったり、冗長性による安定性を狙って e\in\{(\pm 1,0,0),(0,\pm 1,0),(0,0,\pm 1)\} を取ったりする。あの辺の本質的な式は次だろう。

\[ \displaystyle n = \left\lVert\sum_{e\colon E}e\hat{f}(p+\varepsilon e)\right\rVert \]

ちなみに実際には \hat{f}(p) = 0 の仮定が満たされないことが多いので、bias項として抜いてあげるのは実用上必要な場合が多いとは思う。あと局所線形性の仮定は常に成り立つものではないので、一定の破綻はどうしようもないことになる。

続きはそのうち書く

距離の合成とか云々書こうと思ったけど面倒になったのでとりあえず流す。ところでAOについて考えていたけどアレ別にexponential減衰である必要はきっとない?なんかモデル化から導出できないかと思ったけど特に思いつかなかった。

*1:境界に関しては測度0なので無視ということで…

*2:2自由度ではあるが離散的な可能性が残るので