GameMaker:Studio(以下 GM:S)でシェーダを指定して利用する手順、まとめ。

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


シェーダの利用には GameMakerLanguage(以下GML) が必須となります。

リソースに追加されたテンプレートの Pass-Through Shader を使って実際に描画を行う手順は以下。

手順まとめ

  • Create イベント
    • シェーダが利用可能か確認する
    • 利用可能かつ uniform を利用する場合、uniform 用バインド処理の実行
  • Draw もしくは DrawGUI イベント
    • シェーダを指定し、Draw レンダーをシェーダへ切り替える宣言
      • シェーダへ uniform 用の値を送信
      • 実際の Draw 処理を記述
    • シェーダによる描画の終了を宣言、レンダリングターゲットを元へ戻す

Draw のレンダリングをシェーダへ切り替える手法は GM:S の surface 機能などでもすでにお馴染み

    1. 開始の宣言
    2. この間に Draw を実行す
    3. 終了の宣言

開始と終了の宣言の間に、draw を挟む形でコードを記述します。いわゆる Begin and End Block Statements 風な書き方。GML のコードはこの書式が非常に多いため、surface にはすでに慣れた人だったら shaders もほとんど手順は変わらないと分かるはずです。

以下サンプルコード。

var a;
a = pass-through;//シェーダを指定

shader_set(a);//シェーダを使ったレンダリング開始を宣言
draw_self();//実際の draw 処理
shader_reset();//シェーダを利用したレンダリングを終了

関連:GM:S の Surface 機能について
Surface 機能は GPU のメモリ上にテクスチャとして surface を作り、GPU メモリ上のテクスチャへ Draw 機能で描画を行なう機能です

描画する範囲は全画面か、一部領域か

シェーダを使って描画する際、適用される範囲は画面全体なのか、特定のオブジェクト・インスタンスが持つスプライトだけに適用するのかなど、描画する対象と範囲を考えて使う必要があります。

画面全体をシェーダで描画する場合は、

  • aplication surface
  • スクリーンサイズで作成された任意の surface

どちらかに対して描画を行います。この場合は一般的に DrawGUI イベントのタイミングで描画を行った方が無難。

オブジェクトの外観として指定された Sprite をシェーダで描画する場合は、インスタンスの Draw イベント・タイミングでシェーダ描画の開始を宣言後、

    draw_self();

を行います。

参考(YoYoGames):Shaders

次のページへ


Leave a Reply

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