シェーダが利用可能かどうか確認する手順を、起動時に毎回一度だけ実行します。

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

確認は Create イベントのタイミングで行います。

    GM_Studio_14_events_icon_create

万が一、コンパイルに失敗してシェーダを利用できない場合に、shader_set 関数を使ってシェーダを呼び出すとプログラムはクラッシュします

Surface と違って GPU のメモリ上にテクスチャを作ったけど「ちょっとしたきっかけでいつの間にか消えちゃった!」ということがシェーダにはありません。なので起動時に一回だけ利用可能かどうかを確認すれば良いのです。

GLSL は起動時に毎回シェーダをコンパイルします

HLSL 系はオフラインコンパイラがあり、利用も推奨されています。

オフラインコンパイルはプリコンパイル済みファイルを生成・保存し、このバイナリファイルを起動時に読み込む方式。HLSL 系はマイクロソフトが作ったコンパイラしか無く、生成されたバイナリはシェーダプロファイルが対応していればどの GPU でも利用可能です。HLSL はバイナリの使い回しが可能と言える、ただしこのバイナリも中間ファイルなので、GPU 固有のバイナリとして再変換する処理が必要、二度手間がある

参考(MSDN – Microsoft):GLSL と HLSL の対応を示すリファレンス

参考(MSDN – Microsoft):シェーダー モデルとシェーダー プロファイル

参考(MSDN – Microsoft):シェーダー モデル 2 (DirectX HLSL)

GLSL はテキストファイル(いわゆる文字列)をアプリケーション起動時に毎回、搭載されている GPU 固有の専用バイナリへコンパイルします。GLSL 系は GPU ベンダがコンパイラを作成し、ベンダ毎に利用されているコンパイラも異なります。仮に専用バイナリとして出力された結果をキャッシュしても環境が全て同一でない限り使い回しが難しく、GPU ドライバ更新などで環境に変化が生じた場合にはその時点からまた動作の安全性が損なわれる可能性もあります。だからバイナリを使い回すことはせず毎回コンパイルします。

shader_is_compiled 関数の利用

前置きが少々長くなりましたが、ここからは GM:S/GML のお話です。

指定したシェーダが正常にコンパイルされたかどうかを確認するための関数

    shader_is_compiled( ShaderName );

参考(YoYoGames):shader_is_compiled

リソースツリーに登録されたシェーダ名を引数として関数へ渡すと、コンパイルがエラー無く終了していた場合には true 、失敗していた場合には false を返します。GLSL/GLSL ES は上記で述べた仕組み的にもコンパイルエラーのチェックを毎回行った方が安全です。

以下サンプルコード

    if (!shader_is_compiled(Pass_Through)) {
        show_message("Ur hardware ain't support shader - Pass_Through");
    }
    else{
    /* 
    必要なコード(uniform 変数のバインドなど)をここに書く 
    */
    };

安全性が確認できたら、シェーダを利用するためのコードを記述します。

コンパイルに失敗していた場合、その識別子で shader_set 関数からシェーダへアクセスするとプログラムがクラッシュします。

次のページへ


Leave a Reply

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