見出し画像

🎡GLSLでパルックみたいな光の輪

GLSLなどの一部のコーディングでは、他の描画命令よりも少ない量でコーディングができるように見えます。実際GLSLではどのように図形の描画をしているのでしょうか?



ここでは円の方程式から簡単な描画例を見ながら、GLSLの入門編とします。

円の方程式とGLSLの描画モデル

これが円の方程式

実際に上の方程式で縁を描くことができます。

万能計算機ウルフラムで描画した例

実際にGLSLsandbox上で、上の方程式に近いものを描画してみましょう。

glslsandboxの輝度表現となるgl_FragColorはvec4で宣言されています。 https://www.khronos.org/opengles/sdk/docs/reference_cards/OpenGL-ES-2_0-Reference-card.pdf 

こんな感じで、輝度を青の引数にいれて白かった部分を青くすることもできます。

反転させる =割り算の母数にする 1/cとか

限りなくゼロに近いという意味で、1など小さい数をもともとの輝度で割ると、画面が反転したようになります。

こんな感じ、目がチカチカするな

動かして見る。

まずは、方程式のa,bとなっているところにマウスの座標をいれてみましょう。mouse/resolutionとも仕様がみつからなかったですが、mouseには正規化(0-1)された値、resolutionには実際の画面サイズがそれぞれvec2で入っているみたいです。ですので、二つの数字をかけてこんなふうにします

(あくまでも理解のためで、実際はもっと便利な関数や、オペレータがあります)

GLSL特有の関数やベクトルの考えに慣れる length

length関数を使います

length はgenType xを引数としていますが、説明文からgenTypeにvectorが含まれていることがわかります。(仕様書では8章に「以下の組み込み関数が指定され、入力引数(および対応する出力)が float、vec2、vec3、または vec4 である場合、引数として genType が用いられる。」と言う記述もあります)

コードはlengthで非常に短くなることがわかります

上記のコードに、先ほどと同じようにマウスの動きを適用させてみましょう。vec2はそのままで足しひきができるようになっています(演算オペレータがオーバーロードされている)のでかなり簡単にできます。

gl_FragCoordだけvec4なのでxyでvec2に書き換えましょう

absで輪っかにする

「r」の値を一旦マイナスなるように特定の大きさの値を引き算する。absを適用すると、マイナス(黒)だったところがすべてプラスになるので、結果ゼロ以外の箇所がすべて光る。先ほどの反転と併用してこんな感じで輪っかを作ります。


こんなかんじで、プラスになるとおもいない


このとがりが輪っかの輝度


これで輪が太くなる
https://amzn.to/3ififUj 
https://amzn.to/3Qhq1K6 
https://amzn.to/3Gcd1kd 火星には、我々の嫌いな(パクパクパクパク)

P5でもやる


absは同じ効果がある


お願い致します