Last active
October 24, 2021 07:07
-
-
Save gam0022/f11d44bdb44c7154afadc0f44057e850 to your computer and use it in GitHub Desktop.
@zozuar さんのシェーダーが凄すぎたのでコードリーディング
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// @zozuar さんのシェーダーが凄すぎたのでコードリーディング | |
// https://twitter.com/zozuar/status/1441384708441456651 | |
float i, // レイマーチングのループカウンター | |
e, // ボリュームの密度(値が小さいほど密度が濃くなる) | |
s, // fbmのループカウンター | |
g, // レイの進んだ距離(カメラのパースのためにも利用) | |
k = .01;// 0.01の定数 | |
// レイマーチングのループ | |
for ( | |
o++;// o += vec4(1) と同値。ライテイング時に減算するので、ここで1を加算しておく | |
i++ < 1e2;// レイマーチングのステップ | |
g += max(k, e * .2)// レイを進めるステップはボリュームの密度が大きいほど遅らせる | |
) { | |
// カメラの制御 | |
vec3 p = vec3( | |
(FC.xy - .6 * r) / r.y * g + // UVを生成しつつ、gの乗算でカメラのパースをつける | |
r / r * rotate2D(t + g * .5) * .5,// カメラの揺れ。r/r = vec2(1.0) の短縮形 | |
g + t / .3// gでZ方向にレイを進めつつ、時間tでカメラをZ方向にアニメーション | |
); | |
// ボリュームの密度の初期値。カメラの中心だけ密度を減らす。値がマイナス値のときほどボリュームの密度が濃い | |
e = .3 - dot(p.xy, p.xy); | |
// fbmでボリュームの密度を計算 | |
for (s = 2.; s < 2e2; s /= .6) | |
p.yz *= rotate2D(s),// fbmの計算過程で座標を回転 | |
e += abs(dot(sin(p * s + t * s * .2) / s,// sinのfbm(sに周波数が比例、sに振幅が反比例) | |
p - p + 1. // p-p = vec3(0.0) の短縮形 | |
)); | |
// ボリュームレンダリングによるライティング | |
o += o.w * min( | |
e * o// 最新の結果に密度を乗算。eはマイナス値になる場合があることに注意 | |
+ (sin(vec4(1, 2, 3, 1) - p.z * .3) * .6 - .4),// sinによるカラーパレットでカラフルに色付け。この項はほとんどマイナスになる | |
k)// 値を減算していくタイプのライティングなので、k を 0.0 にしても動く | |
* k;// k = 0.01 で係数調整 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment