コンパイル結果をバイナリデータに、コンパイラをオフラインツールにしてVisualStudioに組み込みます。バイナリデータは、ファイル出力とC++ソースコード(配列データ)の2形式で出力できるようにする。VSの組み込みはカスタムビルド。
とりあえず、これで完成。これまでで得られたもの、シェーダの知識(変数、コンパイル)、字句解析処理、カスタムビルドの方法など。
バイナリデータの作成
シリアライズ、デシリアライズではなく、ちょっと違う方法でバイナリ化。バイナリデータに簡単なデータ構造情報を埋め込むことで、構築処理が不要、メモリ確保はバイナリデータ格納用の一回のみになり、簡単&高速構築。
説明するよりソースコードで
#include <d3d11.h>//ステート定義構造体のみ参照
namespace zgfx {
namespace bin {
typedef unsigned char U8;
typedef char I8;
typedef unsigned short U16;
typedef short I16;
typedef unsigned int U32;
typedef int I32;
typedef float F32;
//------------------------
template <typename OBJ>
struct FXBArray
{
typedef OBJ Type;
U32 ptrAry; // 配列先頭(FXHeaderからの相対値)
U32 numAry; // 配列数
U32 nStride; // 1要素のサイズ
};
//------------------------
struct FXBString
{
U32 ptrStr; // 文字列先頭アドレス(文字列領域オフセット)
U32 sizeStr; // 文字列サイズ(終端含む)
};
//------------------------
struct FXBRasterizer
{
FXBString Name;
D3D11_RASTERIZER_DESC Desc;
U32 bitFlag; // 設定フラグ
};
//-----
struct FXBDepthStencil
{
FXBString Name;
D3D11_DEPTH_STENCIL_DESC Desc;
U32 bitFlag; // 設定フラグ
};
//-----
struct FXBBlend
{
FXBString Name;
D3D11_BLEND_DESC Desc;
static const int TARGET_NUM = 8;
U32 bitFlag; // 設定フラグ
U32 bitTarget[TARGET_NUM];
};
//-----
struct FXBSampler
{
FXBString Name;
D3D11_SAMPLER_DESC Desc;
U32 bitFlag; // 設定フラグ
};
//-----------------------------------------
struct FXBShaderInput
{
FXBString Name;
U32 idxSema;
};
//-----------------------------------------
struct FXBResource
{
FXBString Name;
U32 idxBind;
U32 numBind;
U32 idxDesc;
};
//------------------------
struct FXBShader
{
FXBString Name;
U32 eType;
U32 ptrCode;
U32 sizeCode;
FXBArray<FXBShaderInput> aInput;
FXBArray<FXBResource> aCBuffer;
FXBArray<FXBResource> aTexture;
FXBArray<FXBResource> aSampler;
};
//------------------------
struct FXBPass
{
FXBString Name;
U32 idxBlend;
F32 f4BdFactor[4];
U32 bitBdMask;
U32 idxDepthStencil;
U32 uStencilRef;
U32 idxRasterizer;
U32 idxVS;
U32 idxGS;
U32 idxPS;
};
//------------------------
struct FXBTechnique
{
FXBString Name;
FXBArray<FXBPass> aPass;
};
//------------------------
struct FXHeader
{
char head[4]; //"ZGFX"
U32 version1;
U32 version2;
U32 size; // バイナリデータサイズ
// 文字列は文字列領域アドレスからのオフセットで指定
FXBArray<FXBRasterizer> aRs; // ラスタライザステート定義配列
FXBArray<FXBDepthStencil> aDs; // デプスステンシルステート定義配列
FXBArray<FXBBlend> aBd; // ブレンドステート定義配列
FXBArray<FXBSampler> aSp; // サンプラステート定義配列
FXBArray<FXBShader> aShd; // シェーダ定義配列
FXBArray<FXBTechnique> aTech; // テクニック配列
U32 ptrStrings; // 文字列領域アドレス(FXHeaderからの相対値)
U32 sizeStrings; // 文字列領域サイズ
};
}//bin
}//zgfx
ツール化
コンパイルで生成したバイナリデータをファイル出力するツールを作成(fxc.exeの超劣化版)。オプション指定で出力形式などの設定可能、includeやdefine、最適化指定なし(今後必要に応じて)。出力形式はバイナリとC++ソースコードでの配列定義の2種類。
VisualStudio2012への組み込み
プログラムのビルド時にシェーダコンパイルするために、カスタムビルドツールを使用。シェーダソースコードをプロジェクトに追加後、プロパティを変更。
プロパティ設定
全般
項目の種類 ⇒ ”カスタムビルドツール”
カスタムビルドツール
コマンドライン ⇒ ツール実行用のコマンド
出力ファイル ⇒ 出力ファイルのパス(コマンドラインの出力ファイルと同じもの)
詳しい設定などはサンプルプログラムを
サンプルプログラム
コンパイラツール作成用とカスタムビルドツールを使用したビルド時シェーダコンパイル使用例の2つのソリューション。
“DX11エフェクトシステムの作成 Part4 ツール作成” をダウンロード dx11Effect3.zip – 548 回のダウンロード – 67 KB