DX11エフェクトシステム作成 Part4 ツール作成

コンパイル結果をバイナリデータに、コンパイラをオフラインツールにして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 – 450 回のダウンロード – 67 KB

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

認証:数字を入力してください(必須) * Time limit is exhausted. Please reload CAPTCHA.