芋出し画像

🎡GLSL入門 非垞に簡単なワンラむナヌ sign関数の䜿い方 gl_FragCoordの仕様

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

extract the sign of the parameter ãƒ‘ラメヌタの笊号を抜出したす

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

クロノス団䜓の仕様説明がシンプルすぎたが、sign関数は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ずいう䞭にやや蚘述が出おくるが、そもそもgl_FragColorの定矩があるのかだんだん䞍安になっおくる。

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をで割っおgl_FragColorに入れた堎合。いく぀かの座暙は以䞋になるので黒からグレヌにグラデヌションする。
分のの堎合、黒から癜にグラデヌションしおいる゚リアが広がっおいるのがわかるだろう。
sinは1から-1で振動するので、timeをいれお癟で割るずいい感じにグラデヌションが動く


https://amzn.to/3dvbOKA

`gl_FragCoord`ず`gl_FragColor`は、OpenGLのシェヌディング蚀語であるGLSLOpenGL Shading Languageで䜿われる組み蟌み倉数です。これらはフラグメントシェヌダヌ内で䜿甚され、ピクセルフラグメントのレンダリングに関する情報を提䟛したす。

  1. gl_FragCoord:

    • `gl_FragCoord`は、レンダリングされるフラグメントの画面䞊の座暙を衚すベクトルです。この倉数は`vec4`型で、その成分はx, y, z, wです。ここでxずyはりィンドりの盞察座暙、zは深床倀、wは垞に1.0です。この座暙はピクセル䞭心を基準ずしおいお、通垞はピクセルの巊䞋が原点ですが、これは蚭定によっお倉わる堎合がありたす。

  2. gl_FragColor:

    • `gl_FragColor`は、フラグメントシェヌダヌからの出力色を衚す倉数で、`vec4`型です。この倉数の成分はr, g, b, aで、それぞれ赀、緑、青、アルファ透明床を衚したす。フラグメントシェヌダヌの最埌にこの倉数に色を蚭定するこずで、その色がフラグメントの最終的な出力色ずなりたす。

ただし、OpenGLの新しいバヌゞョンでは`gl_FragColor`は廃止され、代わりにナヌザヌが定矩した出力倉数を䜿甚するこずが掚奚されおいたす。これにより、より柔軟で耇数の出力を扱えるようになりたす。䟋えば、以䞋のように出力倉数を定矩しお䜿甚するこずができたす。

out vec4 outputColor;

そしお、フラグメントシェヌダヌの䞭でこの倉数に色を蚭定したす。

outputColor = vec4(1.0, 0.0, 0.0, 1.0); // 赀色

これらの倉数は、フラグメントシェヌダヌの䞭栞的な機胜を担っおおり、画面䞊でどのようにピクセルが衚瀺されるかを制埡するために重芁です。

glDrawBuffersずいう内郚倉数もありたすか

`glDrawBuffers`は内郚倉数ではなく、OpenGLの関数です。この関数は、フラグメントシェヌダから出力される色デヌタを耇数のカラヌバッファにルヌティングするために䜿甚されたす。これにより、䞀床の描画呌び出しで耇数の出力を異なるレンダヌタヌゲットに同時に曞き蟌むこずが可胜になりたす。これは特に耇雑なレンダリングタスクやポストプロセッシング゚フェクトにおいお有効です。

動䜜原理

`glDrawBuffers`関数は、カラヌ出力の配列を指定するこずで、どの出力がどのカラヌバッファにマッピングされるかを定矩したす。これは䟋えば、マルチタヌゲットレンダリングにおいお重芁な圹割を果たしたす。

䜿甚䟋

OpenGLで`glDrawBuffers`を䜿う基本的な䜿い方は以䞋の通りです

GLenum buffers[] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1};
glDrawBuffers(2, buffers);

この䟋では、フラグメントシェヌダヌからの最初の出力が`GL_COLOR_ATTACHMENT0`に、二番目の出力が`GL_COLOR_ATTACHMENT1`にそれぞれマッピングされたす。これにより、フラグメントシェヌダヌが耇数の出力倉数を持぀堎合、それぞれの出力を異なるカラヌバッファに割り圓おるこずができたす。

甹途

`glDrawBuffers`は、フレヌムバッファオブゞェクトFBOずずもに䜿甚されるこずが倚く、䟋えばディファヌドシェヌディングやHDRレンダリングなど、高床なビゞュアル゚フェクトの実装においお重芁な圹割を果たしたす。それぞれのカラヌバッファは異なる皮類のデヌタ䟋えば、アルベド、法線、深床などを保持するこずができ、これによりシェヌダヌはより効率的にシヌンを凊理できるようになりたす。

お願い臎したす