軽率にRaymarchingを写経した

最近シェーダープログラムのお勉強をしているのですが

ということなのでいい機会だからやってみることにしました

写経するのはこちらのシェーダープログラム

UnityのUnlitシェーダーで軽率にRaymarchingを始めるハンズオン

まだ途中ですが以下わからんところ
1-1.とりあえずピンクにしてみる

わかる

1-2.とりあえず黒にしてみる

(0).xxxx 何この書式・・・

1-3.板ポリを3次元っぽく扱えるようにしてみる

xy座標を-1~1の間に正規化してるっぽいことはわかる。
pが3次元での座標を表す変数ということだろうか?

1-4.ここから先はしばらく絵に変化がなくて寂しいのでなんか背景を描いてみる

dotわからん・・・内積がなんなのかわからん・・・

1-5.動きが欲しいので背景を動かしてみる

frac(_Time.y)で時間の小数部を取得するので
座標が斜めに動く→元の位置にワープを
1秒間隔で繰り返す。はず。

1-6.後で使うかもしれない関数を書き足す

rot なぜこの式で回転する・・・?
mod modは除算の余りを返す関数、実際にx=7,y=3で計算すると1が返る。

1-7.途中経過

背景がうごいた・・・!
dotの部分はぜんぜんわからん・・・

2-1.カメラを置く

原点(0,0,0)から -3 z方向に動いた場所にカメラを置いたっぽいことはわかる

2-2.3つの軸を作る

upはわかる
fwdはカメラの向きとは逆のベクトル?を作ろうとしてる?normalizeは0~1に正規化する?
side cross??外積??横向きのベクトルを求めようとしているんだと思うけどcrossが何なのかわからん・・・

2-3.レイの初期座標を決める

わかる

2-4.レイが進む向きを決める

平面上(最初に置いた板ポリ)の向こう側に空間があると想定して
板ポリ上の座標(p.x, p.y)の位置が決まるとレイの向きも決まるということ???

2-5. map関数を作って球を描けるようにしてみる

これ知ってる!進研ゼミで習った距離関数ってやつだ!

2-6.レイマーチするループを作る

レイの位置がオブジェクトとどれだけ離れているか(d)を取得して
一定の距離以下ならばループを抜ける、そうでなければレイの先端からdの距離分だけレイを進める。だっけ?

2-7.mapの結果を使って白で書いてみる

距離が一定以下(オブジェクトと衝突)したら白を返すということですね。わかります。

3-1.動かしてみる

PI / 2を足してる理由は背景の青い円と動きをずらすためっぽい?

3-2.立体感を出すために法線を使ってみる

EPSILONとは・・・?なぜあの式で法線が算出できるのか・・・?


3-3.ライトの位置と色を決めてみる
normalizeでライトの位置(向き)を0~1に正規化
Lcolは単純に色を指定している
ここでエラーになる原因に関してはdotが返すのはfloat型の値だからだということを教えてもらいました。 サンキュー!

3-4.ライトと法線の角度を元にライティングしてみる
returnの行でエラーになる。どうして・・・?


3-5.そこはかとなくいじっておしまい
uv2の座標にfloorを使うことで座標を升目状に区切ってるっぽい?

後半の法線が出てきたあたりからは完全についていけなくなったのと内積、外積がほんとにわからんので その辺をちょっとは勉強する必要がありそうだなー。と思いました。まる。

TOP

コメントする

メールアドレスが公開されることはありません。

CAPTCHA