++レイマーチングとは何か?
メッシュではなく、距離関数を用いてオブジェクトをレンダリングする手法。フラクタル図形や無限繰り返しが可能であり独特の表現が可能になる
++レイマーチングの原理
固定長進行レイマーチングやってみたので簡単なサンプルと解説 - やぎりのブログ
[GLSL] レイマーチング入門 vol.1 - Qiita
wgld.org | GLSL: レイマーチングで球体を描く |
wgld.org | GLSL: 法線の算出と簡単なライティング |
この3つを通して読めば大体把握できると思う
++++私がレイマーチングの理解で詰まったところ
レイマーチング、というかシェーダの基本的な部分で詰まっていた。
++ラスタライザの不理解
ラスタライザが頂点間の補完をすることは知っていても、HLSL上で実際にどのように動くのかを理解してなかったために以下のような疑問にぶち当たった
実際にはvertからfragに渡されるv2f構造体の中身全てがfragに渡った時点で補完された値に変わっている
shader ラスタライザについて - イラスト、モデリング、Unity、VR関連
++unity_WorldToObjectの不理解
mul(unity_WorldToObject,float4(_WorldSpaceCameraPos,1)).xyz;
下記に出てくるブタジエンさんのサンプルコードでこのような記述が出てきた。最初私は勘違いをしていたのだが、正解を述べるとunity_WorldToObjectは乗算すると、処理中のオブジェクトの原点を中心としたローカル座標空間に変換される。なので、WorldSpaceCameraPosが変換された座標の座標空間は処理中のオブジェクトと原点をともにしており実質的に同一座標空間にある.。
++ブタジエンさんのサンプルコード
なんか最近知り合いでUnityレイマーチに挑戦してる方をちらほら見るので、Unityレイマーチのサンプルコードを置いておくなど キューブにでも当ててください 球が出てきます。https://t.co/KxB7rWiPmf
— ブタジエンC4H6 (@butadiene121) April 21, 2019
++陰関数の法線
float3 getnormal(float3 p){ float d = 0.0001; return normalize(float3( dist(p + float3(d, 0.0, 0.0)) - dist(p + float3(-d, 0.0, 0.0)), dist(p + float3(0.0, d, 0.0)) - dist(p + float3(0.0, -d, 0.0)), dist(p + float3(0.0, 0.0, d)) - dist(p + float3(0.0, 0.0, -d)) )); }
これで法線を取得出来る理由
この処理は共通なので、こういうもの、と思っておくだけでも問題ないと思う。
++繰り返し
[SphereTracing:領域操作関数]ハニカム構造 - Qiita
距離関数 primitive(q) に点座標を渡す前に、繰り返し距離の剰余にするだけで無限繰り返しになります。
らしいのでブタジエンさんのコードでやってみたらこうなった
float sphere(float3 p){ return length(p) - 0.5; } float3 mod(float3 a, float3 b){ return frac(abs(a / b)) * abs(b); } float _Cx; float dist(float3 p){ return sphere(mod(p,_Cx)-0.5*_Cx); }
変更箇所,剰余を取るmodメソッドを追加し、距離関数のラッパーにてコールしてから距離関数をコールしている,_Cxは繰り返し回数のパラメーター
++距離関数の合成
https://www.slideshare.net/shohosoda9/threejs-58238484
+++++
以下、私の他の記事でのレイマーチングの記述
個人的に便利なので載せてる
++レイマーチング
メッシュではなく、距離関数を用いてオブジェクトをレンダリングする手法。フラクタル図形を描ける
[GLSL] レイマーチング入門 vol.1 - Qiita
レイマーチングには、
Unity でオブジェクトスペースの Raymarching をフォワードレンダリングでやってみた - 凹みTips
ディファードレンダリングでのオブジェクトスペース
Unity でオブジェクトスペースのレイマーチをやってみた - 凹みTips
ディファードレンダリングとコマンドバッファを使った手法
Unity で Command Buffer を使って Raymarching をしてみた - 凹みTips
の3種類があるっぽい
コマンドバッファを使うものはc#が必要
また負荷の問題などオブジェクトスペースでやる方が利点が多いっぽい
また手法によってレイマーチのやり方も少し違ってくる
スクリーン全体で行うときはレイの開始点がカメラの Near Clip 位置でしたが、オブジェクトスペースの場合これをポリゴン表面の位置にすることができ、より少ないループで数式で表現される図形の近傍までレイが到達できます。
++レイマーチング・距離関数
GLSL Graphics Compo向けのレイマーチング向けのチュートリアルです
[SphereTracing:領域操作関数]ハニカム構造 - Qiita
GLSL でのレイマーチングについて雑に語ってみます - Qiita
[GLSL] レイマーチング入門 vol.1 - Qiita
Unity でオブジェクトスペースの Raymarching をフォワードレンダリングでやってみた - 凹みTips
Unity で Command Buffer を使って Raymarching をしてみた - 凹みTips
Unity でオブジェクトスペースのレイマーチをやってみた - 凹みTips
距離関数のfold(折りたたみ)による形状設計 | gam0022.net
正解するカドの「カド」をレイマーチングでリアルタイム描画する | gam0022.net
GLSL SandBoxで手軽にレイマーチングで遊ぼう - Akatsuki Hackers Lab | 株式会社アカツキ(Akatsuki Inc.)
[コードリーディング] レイマーチングによる波表現を読み解く - Qiita
[コードリーディング vol.2] レイマーチングによる雲表現を読み解く - Qiita
++距離関数リスト
Inigo Quilez :: fractals, computer graphics, mathematics, shaders, demoscene and more