イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

レイマーチングについて

++レイマーチングとは何か?

メッシュではなく、距離関数を用いてオブジェクトをレンダリングする手法。フラクタル図形や無限繰り返しが可能であり独特の表現が可能になる

 

++レイマーチングの原理

固定長進行レイマーチングやってみたので簡単なサンプルと解説 - やぎりのブログ

[GLSL] レイマーチング入門 vol.1 - Qiita

wgld.org | GLSL: レイマーチングで球体を描く |

wgld.org | GLSL: 法線の算出と簡単なライティング |

この3つを通して読めば大体把握できると思う

 

 

++++私がレイマーチングの理解で詰まったところ

レイマーチング、というかシェーダの基本的な部分で詰まっていた。

 

++ラスタライザの不理解

ラスタライザが頂点間の補完をすることは知っていても、HLSL上で実際にどのように動くのかを理解してなかったために以下のような疑問にぶち当たった

f:id:arumogina:20190606195625p:plain

実際にはvertからfragに渡されるv2f構造体の中身全てがfragに渡った時点で補完された値に変わっている

shader ラスタライザについて - イラスト、モデリング、Unity、VR関連

 

++unity_WorldToObjectの不理解

mul(unity_WorldToObject,float4(_WorldSpaceCameraPos,1)).xyz;

 下記に出てくるブタジエンさんのサンプルコードでこのような記述が出てきた。最初私は勘違いをしていたのだが、正解を述べるとunity_WorldToObjectは乗算すると、処理中のオブジェクトの原点を中心としたローカル座標空間に変換される。なので、WorldSpaceCameraPosが変換された座標の座標空間は処理中のオブジェクトと原点をともにしており実質的に同一座標空間にある.。

 

++ブタジエンさんのサンプルコード

 

++陰関数の法線

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))
	));
}

これで法線を取得出来る理由

【3分で分かる!】法線とその求め方 | 合格サプリ

この処理は共通なので、こういうもの、と思っておくだけでも問題ないと思う。 

 

++繰り返し

[SphereTracing:領域操作関数]ハニカム構造 - Qiita

 距離関数 primitive(q) に点座標を渡す前に、繰り返し距離の剰余にするだけで無限繰り返しになります。

らしいのでブタジエンさんのコードでやってみたらこうなった

f:id:arumogina:20190606225059p:plain

 	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は繰り返し回数のパラメーター

 

++距離関数の合成

f:id:arumogina:20190609005403p:plain

f:id:arumogina:20190609005418p:plain

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