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 というプレフィックスを付けてあるのは、この変数がシェーダへ値を渡すため用意した(バインド済みの)変数であることを示します。

次のページへ


Leave a Reply

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