GameMaker:Studio(以下 GM:S)でシェーダを指定して利用する手順、まとめ。
シェーダの利用には GameMakerLanguage(以下GML) が必須となります。
リソースに追加されたテンプレートの Pass-Through Shader を使って実際に描画を行う手順は以下。
手順まとめ
- Create イベント
- シェーダが利用可能か確認する
- 利用可能かつ uniform を利用する場合、uniform 用バインド処理の実行
- Draw もしくは DrawGUI イベント
- シェーダを指定し、Draw レンダーをシェーダへ切り替える宣言
- シェーダへ uniform 用の値を送信
- 実際の Draw 処理を記述
- シェーダによる描画の終了を宣言、レンダリングターゲットを元へ戻す
Draw のレンダリングをシェーダへ切り替える手法は GM:S の surface 機能などでもすでにお馴染み
開始の宣言
- この間に Draw を実行す
終了の宣言
開始と終了の宣言の間に、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
[divpage]