GLSLが楽しい

経緯

前回のSMTP++でsanographixさんがVJやってるときに少し触らせてもらって、楽しかったのと、 VJ思ったよりずっと忙しくて、DJよりも人が少ないということもあって、次回VJもやります、となった。

「やりいたい!」→「いいよ!」という雰囲気がSMTP++のよいところだと思っていて、みなさん優しくて暖かい。 (とはいえ宣言することで後に退けなくして、未来の自分の行動を決めるのそろそろ卒業したいと思っております。)

VJ

仕事でUnityを触っていて、最近3Dも少しやったので、Unityでやれば仕事のスキルも上がって一石二鳥じゃんwと思ったんだけど、 マシンスペックが追いつかずFPSが10とかになったので、veda でいくことにしました。 vedaというのはamagiさんが作ったガチボコにかっちょいいAtomのやつです。

GLSL

とりあえず、以下の3つを読んだりしてる。

https://thebookofshaders.com/?lan=jp https://wgld.org/d/glsl/ https://www.iquilezles.org/www/index.htm

読むのは疲れるので人の書いたカッコいいやつをコピペして弄るとかもよい。

http://glslsandbox.com/ https://glslfan.com/

感想

楽しい。 人のコードを読むと未知のアイデアに溢れていて、 ちゃんとコードを読むとアイデアが完全に理解できるのがめちゃくちゃ良い。 まだ触り始めて2、3日だけど、おもしろいなと思うことが結構あったので、それについて書く。

レイマーチング

レイマーチングのポイントは「描画したい対象の形を距離関数をつかって記述する」ということで、 逆にいうと、距離関数の具体的な形が書けるやつは描けるということになる。 形がわかる = 距離関数がわかる、というのは言われてみればそうだけど、確かに〜〜という感じ。

あとレイをマーチさせるというのもめちゃくちゃ面白い。 「レイを飛ばしてヒットしたら描画する」と言われると、レイを少しずつ伸ばしてヒットしたかどうかを見る とかやりそうだけど、現在位置から描画対象への距離分だけ進めても、ヒットする or ヒットしない 以外起こらない、 みたいなのは、それは確かにその通りで、確かに回数がずっと減る〜〜〜〜となりました。天才。

繰り返し

レイマーチングで距離関数に渡す前に p = mod(p, r) - r * 0.5; するやつ。 無限に増えて笑顔になります!!! Image from Gyazo

グラフを書く

GLSL sandbox かなんかで学んだ気がするけど、該当するやつが見つからない。ごめんなさい。 y = f(x) のグラフを描くときに、step とか smoothstep とかをつかわずに

color = vec3(0.2) / abs(y - f(x));

とすると、グラフが白く描ける!みたいなやつ。小さい数で割ると大きくなるのは、それはそう。 Image from Gyazo

引き算

メイガーのスポンジの描画方法で学んだ。 https://www.iquilezles.org/www/articles/menger/menger.htm

描画したい対象CがC1からC2を引っこ抜いた形になってるときに、 CC1C2 への距離関数をそれぞrdistdist1dist2とすると、

dist(p) = max(dist1(p), -dist2(p));

になるというやつ。これ数学の人が見たら、いやいやいやwwとなると思うんだけど、 GLSLの距離関数は、点が対象の内部にあるときは負の値を返すようになっているので、こういうトリックが使えるのだ。。。。 Image from Gyazo