つぶやきGLSLで俺的raymarching
やり方と言うのは色々あるので俺的raymarchingって事にさせてもらいました。
久々につぶやきGLSLをやったら、スタイルを忘れてた。なので纏める事にしました。
2通りの手法を使ってました。一つはレイが衝突したらループを抜けて色を付ける方法。もう一つは、ループを最後までやって衝突しても加算で色を付けていく方法。
解りづらいので改行を入れて書きます。カウントは改行無しの文字数とします。これらは単純に球を出すだけのshader。twiglのgeekest(300es)で絵がでます。
レイが衝突したらループを抜けて色を付ける方法。(100chars)
float i,g,d=1.; for(vec3 p;++i<99.&&d>.001;g+=d=length(p)-1.) p=vec3((FC.xy-.5*r)/r.y*g,g-3.); o+=3./i;
ループを最後までやって衝突しても加算で色を付けていく方法(99chars)
vec3 p; for(float i,g,e;++i<99.;e<.001?o+=.2/i:o) p=vec3((FC.xy-.5*r)/r.y*g,g-3.), g+=e=length(p)-1.;
最近の奴は後述のループを最後までやって衝突しても加算で色を付けていく方法を使っていました。GPU負荷は微妙に高い気もするし、要らない
処理な気もするが、こちら一本になってました。1char短いのが本当の理由では無くてループを最後まですることによるメリットのせいであります。最後まですることでボリュームレンダリングみたいな事ができます。ボケもどきやグローぽい事が出来ます。
色付けの方法ついて。
本来ならo=vec4(0);
もしくはo-=o;
と初期化をしないといけないのですが省略しています。shadertoyで、これをやると速攻コメントが飛んでくるので注意。
o=vec4(0);
が前提なのでo+=.2/i:
これで色付け(モノトーン)はOKです。
超基本の.2/i
。これはループ回数の逆数を使うことでAOになるというfakeスキルです。なので厳密ではありませんが立体感がでます。数字は画面を見ながら調整です。これだけの事ですけど、SDFを駆使する方向の事なら充分に遊べます。
ボケもどきやグローぽい事なのですが、複雑なSDFを利用しての方法になります。説明しきれないのでヒント的な事だけにします。
e<.001?o+=.2/i:o
この部分のe<.001
の数字を大きくしてボケ、グローみたい事が出来るシチュエーションがあったり、三項式を外してビルトイン関数とg
,e
,p
等の変数を駆使して色々したりします。これは追々、整理しておきます。とりあえず、つぶやきGLSLの中に色々とスキルがありますよ。