見出し画像

🎡GLSLワンライナー 非常に簡単なやつ sign関数の使い方 gl_FragCoordの仕様

こんな感じのを数行で実現した

extract the sign of the parameter パラメータの符号を抽出します

https://registry.khronos.org/OpenGL-Refpages/gl4/html/sign.xhtml

クロノス団の説明がシンプルすぎるが、x が 0.0 より小さい場合は -1.0、x が 0.0 に等しい場合は 0.0、x が 0.0 より大きい場合は +1.0 を返す。ということのようだ、それを元に、円を形成することになる上のコードを再分配再結合していく。

この行ね

まず先入観をとっぱらうためにgl_FragCoordの仕様をみてみる

gl_FragCoord - 現在のフラグメントのウィンドウ相対座標が格納されます.

https://registry.khronos.org/OpenGL-Refpages/gl4/html/gl_FragCoord.xhtml

フラグメント言語でのみ利用可能な gl_FragCoord は、フラグメントのウィンドウ相対座標 (x, y, z, 1/w) 値を格納する入力変数です。z成分は、シェーダがgl_FragDepthへの書き込みを一切含まない場合、フラグメントの深度として使用される深度値です。
デフォルトでは、gl_FragCoord は、ウィンドウ座標の左下原点を仮定し、ピクセルセンターがハーフピクセルセンターに位置することを仮定します。例えば、ウィンドウの左下端のピクセルに対して、(x, y) の位置 (0.5, 0.5) が返されます。gl_FragCoordの原点は、gl_FragCoordをorigin_upper_left識別子で再宣言することによって変更することができます。ピクセルが整数ピクセルのオフセットの中心にあるように見えるように、返される値は、pixel_center_integerによってxとyの両方で半分ピクセルだけシフトさせることができます。これは、デフォルトで (0.5, 0.5) の gl_FragCoord が返す (x, y) 値を pixel_center_integer で (0.0, 0.0) に移動させます。
プログラム中のいずれかのフラグメントシェーダで gl_FragCoord が再宣言された場合、そのプログラム中の gl_FragCoord を静的に使用するすべてのフラグメントシェーダで再宣言されなければなりません。ラスタライズ、変換、または OpenGL パイプラインや言語機能の他の部分には影響しま せん。

https://registry.khronos.org/OpenGL-Refpages/gl4/html/gl_FragCoord.xhtml

最後に点群の色を決めるのが、gl_FragColor

不要な情報を読み飛ばしてなんとか理解する。一方で、最後に点群の色を決めるのが、gl_FragColorだ、これも仕様をみておこう。

と思って、みてもないgl_FragColor 

glDrawBuffersという中に記述が出てくるがだんだん不安になってくる。

glDrawBuffers は、フラグメントカラー値やフラグメントデータが書き込まれるバッファの配列を定義します。フラグメントシェーダがアクティブでない場合、レンダリング操作はフラグメントごとに1つのフラグメントカラーだけを生成し、それはbufsで指定されたバッファのそれぞれに書き込まれます。フラグメントシェーダがアクティブで、出力変数 gl_FragColor に値を書き込む場合、その値は bufs で指定された各バッファに書き込まれます。

https://registry.khronos.org/OpenGL-Refpages/gl2.1/xhtml/glDrawBuffers.xml

glDrawBuffersがどこの並行世界の何者なのか、わからないし、知る必要もない。知ってる人は知っていればいいが、今つかってる処理系での役割とかたちふるまいから gl_FragColorは、出力変数であるというのは、志を同じくしている。

最終的なピクセルの色は、予約語として確保されたグローバル変数、gl_FragColorに割り当てられます。

https://thebookofshaders.com/02/?lan=jp

本当は仕様をみたかったが、みつからないので、こういう概念図になると思う。

main内部、この処理がピクセル数分だけ同時並行で処理される

GLSLは一個書いたメインがCoord分だけ同時にGPUが処理をして描画する。

gl_FragCoordに対応してgl_FragColorを設定するコードは、値はどのフラグメントも1以上なので(座標だから)、この場合は真っ白になる
gl_FragCoordを10で割ってgl_FragColorに入れた場合。いくつかの座標は1以下になるので黒からグレーになる。
100分の1の場合、黒から白にグラデーションしているエリアが広がっているのがわかるだろう。
sinは1から-1で振動するので、timeをいれて百で割るといい感じにグラデーションが動く


https://amzn.to/3dvbOKA


お願い致します