Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@gam0022
Last active October 24, 2021 07:07
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save gam0022/f11d44bdb44c7154afadc0f44057e850 to your computer and use it in GitHub Desktop.
Save gam0022/f11d44bdb44c7154afadc0f44057e850 to your computer and use it in GitHub Desktop.
@zozuar さんのシェーダーが凄すぎたのでコードリーディング
// @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