Vertex Shader(バーテックスシェーダ/頂点シェーダ)について

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

選択されているシェーダ記述言語は GLSL ES

頂点シェーダは頂点に対してのみ作用するシェーダです。

頂点シェーダの用途は頂点の座標操作/変換、テクスチャ座標の編集(テクスチャ UV など)と法線(Normal)だが、GM:S の場合、メインは 2D なので vertex では一般的にあまり高度な操作はしません。

新規作成されたシェーダテンプレート「Pass-Through」 の頂点シェーダは以下のように記述されています。

//
// Simple passthrough vertex shader
//
attribute vec3 in_Position;     // 頂点情報を GM:S アプリケーションから受け取る
attribute vec4 in_Colour;       // 頂点カラー/色を GM:S から受け取る
attribute vec2 in_TextureCoord; // テクスチャ座標を GM:S から受け取る
// Built-in Attributes は無いが、上記変数名は GM:S が事前に指定しているため変更不可です
varying vec2 v_vTexcoord; // 値を Fragment へ渡すための変数
varying vec4 v_vColour;   // 値を Fragment へ渡すための変数
// ここまでは変数の宣言、以下メイン関数( void main 関数)
void main()
{
    vec4 pos    = vec4( in_Position, 1.0);
    gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * pos;
//gl_Position には4次正方行列と頂点の乗算結果、即ち頂点のビュー変換/射影変換位置が格納される
    v_vColour   = in_Colour;
    v_vTexcoord = in_TextureCoord;
//attribute で GM:S から受け取った頂点毎の頂点カラーとテクスチャ UV 情報をFragment へ送信
}

C 言語に近い雰囲気を持つシンプルなコードです。しかし GML ユーザにとって見慣れない修飾子や変数型が多数あると思います。

attributevaryinguniform は GLSL 固有の修飾子です。役割については後述。

vec2vec3vec4 はベクトル型としての宣言、つまり変数の型を指定しています。2/3/4といった数字はベクトルの要素数を表す。ベクトル型はベクトル演算のために利用される変数型。行列(あるいはベクトル)は GPU が得意とする演算で、ハードウェア性能を活かした高速処理が期待できます。

GLSL ES シェーダの構造は単純

  • 変数・定数の宣言(グローバルスコープ
  • ユーザ定義関数の宣言(必要に応じて
  • 戻り値や引数を持たない main 関数

ユーザ定義関数は必須ではないため、おおまか分類すれば変数宣言void main 関数だけで成り立ちます。

Vertex と Fragment は別々のプログラム

両者は GPU 上で実行される小さなプログラム同士ではありますが、異なった処理を担当するプログラムであり、動作は独立しています。

実行順も固定で、変数・関数の名前空間も共有されません。

変数スコープはグローバルおよびローカルがあるのみですが、例えば Vertex で宣言されたグローバル変数は Vertex 内でしか利用できません。単に同じ名前で Vertex / Fragment 両方から宣言しても値は共有されない。

主アプリケーション(ここでは GM:S で作成されたプログラム)からシェーダへ値を送信する場合にも、各シェーダへ別々に値を送信します。

構文規則

if/else if や repeat/for など基本的な条件分岐および繰り返し処理は GML の知識でも一応通用します。switch case は使えません。

しかし構文エラーのチェック機能がエディタには無いため、コンパイルしないと構文エラーが分かりません。デバッグはけっこう厄介です。

シェーダ用組み込み変数/関数

シェーダエディタ上では宣言無しで利用可能な組み込み変数および定数があります。

GLSL ES 固有の組み込み変数及び関数もオートコンプリートおよびカラーハイライトが機能します。

例:gl_Position ※ gl_position は vertex 固有の組み込み変数

しかしドキュメントは YoYoGames 内には用意されていないので、これらの使い方については GLSL ES 公式リファレンスなどを参照のこと。

参考:The OpenGL® ES Shading Language(PDF)

GM:S/GML 固有のシェーダ専用組み込み変数・定数も用意されています。これらはシェーダエディタ上でオートコンプリートが機能し、カラーハイライトもあります。

例:gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION]

参考(YoYoGames):Shader Constants

補足
プレフィックスが gl_ で始まる変数は OpenGL ES の組み込み変数、宣言無しで利用可能
gl_Position は 4次正方行列と(x,y,z,w) 四つの要素から成るベクトルを掛け合わせた計算結果
ベクトル要素に w が必要な理由 →  
gl_Position は Vertex シェーダに固有の組み込み変数、Fragment では利用ができない

プレフィックスが gm_ で始まる変数は GM:S のシェーダ用組み込み変数、宣言無しで利用可能

次のページへ


Leave a Reply

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