GLSL 固有のストレージ修飾子 uniform は、主アプリケーション( CPU 側)から送信されたデータを各シェーダ( GPU )で値として受け取るための変数に対して宣言されます。
シェーダの uniform 変数へ値を送信するために GML でバインド用コードを書きます。
shader_get_uniform 関数
Create イベントのタイミングで、スコープがインスタンスもしくはグローバルで確保された変数に対してバインドしてください。
shader_get_uniform( ShaderName , uniform );
参考(YoYoGames):shader_get_uniform
バインドのタイミングについて、決まり事は無いので(無駄な処理で無ければ)毎回 Draw イベント時、適当な自動変数を使ってバインドしても構いません。変数のスコープも用途に応じて自己判断してください。
以下サンプルコードでは GM:S のインスタンス変数「 uni_xpos 」に対して、shader_get_uniform 関数の
第1引数に「 SH_RotateImage 」というシェーダ名、
第2引数にはシェーダ内で「 u_xpos 」という uniform 修飾子を付けた変数と同じ名前を「文字列」として渡してあります。
以下サンプルコード
var a,b; a = SH_RotateImage;// リソースツリーに登録されたシェーダ名(文字列では無い) if (!shader_is_compiled(a)) { b = "Ur hardware ain't support shader - SH_RotateImage"; show_message( b ); } else{ b = "u_xpos";// シェーダ側で定義されている変数名(文字列として) uni_xpos = shader_get_uniform( a , b ); };
インスタンス変数に対する uniform のバインドはこれで終了。
これ以降気を付けたいのは、バインドしたことを忘れて GML コードでインスタンス変数へ直接値を代入しないこと。値の送信には専用関数を利用します。
その関数(shader_set_uniform_f 関数など)を通じて GPU へ値を渡します。
変数名に uni
というプレフィックスを付けてあるのは、この変数がシェーダへ値を渡すため用意した(バインド済みの)変数であることを示します。
[divpage]