ディスプレイに表示される画像/映像は最終的に全て「ラスタライズ/Rasterization」されています。つまりディスプレイに表示されている映像の正体は「色の付いた小さな点の集まり」です。

このエントリーをはてなブックマークに追加

Fragment(フラグメント)Shader は「領域に表示される色(色付きの小さな点=ピクセル/Per-Pixel=Per Fragment)」を扱うプログラムです。

ただし厳密に言うと扱う情報は「色」だけではなく、Alpha や Depth 、そして Stencil なども扱います。

Pass-Through/Fragment Shader の記述例

//
// Simple passthrough fragment shader
//
varying vec2 v_vTexcoord;  //Vertex から渡された UV 情報
varying vec4 v_vColour;    //Vertex から渡された頂点の色情報

void main()
{
    gl_FragColor = v_vColour * texture2D( gm_BaseTexture, v_vTexcoord );
}

Pass-Through の Fragment は Vertex より記述が更にシンプル。表示すべき色をそのまま表示しているだけなので、シェーダとしては極めて単純な処理だからです。

varying 修飾子

varying は先に実行された Vertex から送信された値を Fragment で受け取るために利用されます。変数名と変数型は Vertex Shader と全く同じ指定をこなしてください。

gl_FragColor(GLSL ES の組み込み変数

gl_FragColor は GLSL ES の組み込み変数、宣言無しの利用が可能。

texture2D は GLSL ES の組み込み関数。この関数に二つの引数を与えて得られた vec4 型の戻り値を gl_FragColor へ代入します。

    vec4 texture2D(sampler2D sampler , vec2 texcoord)

texture2D 関数の第一引数に用いられている gm_BaseTexture は GM:S の Shader 用定数の一つで、指定されたオブジェクトの Sprite/Surface/Background から色情報を抽出するために用いられます。

※ これら全部ひっくるめて「テクスチャ」で良い(実際全部テクスチャだし OpenGL はテクスチャしか扱わない

一応このテンプレートでは Vertex から頂点色の情報も受け取っていますが、頂点色を無視してもよいのならば最初から varying せず、gl_FragColor への代入も以下のような記述が可能。

gl_FragColor = texture2D( gm_BaseTexture, v_vTexcoord );

このように単純化することもできます。

シェーダを使って描画する GML コード

Pass-Through シェーダは簡単な処理なので、シェーダコードはこれだけで完結します。あとはシェーダを使って実際に描画するだけですが、GML が必要に成るとはいえ手順は相当簡略化されていますし、コードもシンプルなものです。つまり GM:S を使った開発者はリソースに追加されたシェーダを簡単に利用できます。

シェーダを利用するに際して GML を使ったバインド処理(情報の関連付け処理)が多少は必要に成ります。

バインドは主アプリケーションと GPU 間でやり取りされる情報を格納するための uniform 変数、及びシェーダで描画する対象となるグラフィックスリソース(2D サンプラー)を選択・指定し GPU のテクスチャメモリプールへ追加/情報を送信する処理などのことです。

次のページへ


Leave a Reply

Your email address will not be published. Required fields are marked *