ホーム < ゲームつくろー! < プログラマブルシェーダ編

シェーダシステム編
その4 やっぱりシェーダ本文の生成支援もしよう:サンプルプログラム

 DirectXプログラマブルシェーダ編シェーダシステム編「その4 やっぱりシェーダ本文の生成支援もしよう」で説明した内容を踏まえたサンプルプログラムです。実行するとプログラム内でシェーダが自動生成され、それを使ってポリゴンが描画されます:


使い回しがばればれだ!

 このプログラムはピクセルシェーダ2.0以上で動作します。
 今回も見た目は前章のサンプルと全く変わらないのですが、内部のShaderCreatorクラスでシェーダ本文の簡単なコンバートが行われています。これにより、文字列連結の演算子によって起きていた可読性の低下が無くなりました。使用前後はこんなです:

// 頂点シェーダコード
void MyShaderCreator::vertexShaderCode( std::string &out, VertexInputSemanticsStruct &In, VertexOutputSemanticsStruct &Out ) {

    out += "\tVS_OUTPUT Out = (VS_OUTPUT)0;\n\t";
    out += Out.pos.n() + " = " + In.pos.n() + ";\n\t";
    out += Out.tex0.xy() + " = " + In.texCoord.n() + ";\n\t";
    out += "return Out;\n";

}

上が今回のコンバータを導入する前のコードで、下がコンバータを導入した後の本文です:

// 頂点シェーダコード
void MyShaderCreator::vertexShaderCode( std::string &out, VertexInputSemanticsStruct &In, VertexOutputSemanticsStruct &Out ) {
    out +=
        "VS_OUTPUT Out  = (VS_OUTPUT)0; \n"
        "$(Out.pos)     = $(In.pos);    \n"
        "$(Out.tex0).xy = $(In.uv);     \n"
        "return Out;\n";
}

双方とも同じ頂点シェーダ文を出力するのですが、下の方が明らかに見やすいです。$(***)の部分がコンバートされて適切な変数名に置き換わります。


○ プログラムの動かし方

 こちらからプログラムをダウンロード(SSSmp_No4_ShaderProgramHelper)します。全てのファイルを新規プロジェクトに追加して実行するとeffect.fxというシェーダが作成され、それを用いて上のような描画が行われます。
(もしうまく動かないようでしたら掲示板にてご連絡下さい)