VertexShader のプログラム組み込み

VertexShader インチキ環境マッピング+いろいろ 」などのソースの場合、ヴァーテックスシェーダーのプログラムのファイル「vsample01.vsh」を読み込んで使用していたのですがCのソースに埋め込んで見ましょう。

G9lib.cpp

	:
//------------------------------------------------------------------------------
//■ライブラリ初期化
//------------------------------------------------------------------------------
bool	G9lib::Init( HWND hwnd )
{
	const char VertexShader[] =
		"vs_1_1\n"\
		"def c4, 0.0f,  0.5f,  1.0f,  0.20f\n"\
		"def c5, 0.566f,  0.566f,  0.566f,  0.0f\n"\
		"def c6, 1.0f,  0.5f,  0.0f,  0.0f\n"\
		"def c7, 0.0f,  0.0f,  0.5f,  0.0f\n"\
		"dcl_position	v0\n"\
		"dcl_normal		v1\n"\
		"m4x4	oPos, v0, c0\n"\
		"m3x3	r0, v1, c0\n"\
		"dp3	r0.w, r0, r0\n"\
		"rsq	r1, r0.w\n"\
		"mul	r0, r0, r1\n"\
		"mad	oT0.xy,r0.xy,c4.yy,c4.yy\n"\
		"dp3	r0.w, r0, c5\n"\
		"mad	r0.x, r0.w, c4.y, c4.y\n"\
		"sub	r0.y, c4.z, r0.x\n"\
		"mul	r1, r0.x, c6\n"\
		"mad	oD0, r0.y, c7, r1\n"\
		"mul	r0.x, r0.x, r0.x\n"\
		"mul	r0.x, r0.x, r0.x\n"\
		"mul	oD1, r0.x, r0.x\n";
	// Direct3Dオブジェクトの取得
	pD3D = Direct3DCreate9(D3D_SDK_VERSION);
	if (pD3D == NULL) {
		MessageBox( hwnd, L"Direct3Dの初期化に失敗しました、DirectX 9.0がインストールされているか確認してください。",L"Base",MB_OK | MB_ICONSTOP);
		return FALSE;
	}

	// 現在のディスプレイモードを得る
	D3DDISPLAYMODE dmode;
	if (FAILED(pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &dmode))) {
		MessageBox( hwnd, L"ディスプレイモードの取得に失敗しました。",L"Base",MB_OK | MB_ICONSTOP);
		return FALSE;
	}
	// バックサーフェースのフォーマットをコピーして使用する
	ZeroMemory(&d3dppApp, sizeof(d3dppApp));
	d3dppApp.Windowed	= TRUE;							// ウィンドウモード
	d3dppApp.SwapEffect = D3DSWAPEFFECT_DISCARD;		// 垂直同期でフリップ
	d3dppApp.BackBufferCount = 1;
	d3dppApp.BackBufferFormat = dmode.Format;
	d3dppApp.EnableAutoDepthStencil = TRUE;
	d3dppApp.AutoDepthStencilFormat= D3DFMT_D16;

	// デバイスの作成
	if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dppApp, &pD3DDevice))) {
		if (FAILED(pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dppApp, &pD3DDevice))) {
			MessageBox( hwnd, L"デバイスの作成に失敗しました、画面モードが16ビットあるいは32ビットになっていることを確認してください。",L"Base",MB_OK | MB_ICONSTOP);
			return FALSE;
		}
	}
	//-------------------------------------------------------------------
	ID3DXBuffer*    pshader;
	if ( FAILED(D3DXAssembleShader( VertexShader , sizeof(VertexShader) - 1, 0 , NULL , 0, &pshader , NULL )))
		return FALSE;
	if( FAILED(pD3DDevice->CreateVertexShader((DWORD*)pshader->GetBufferPointer(),&vShader) )){
		pshader->Release();
		return FALSE;
	}
	pshader->Release();
	//-----------------------------------------
	//	モデル登録
	void       *lpVertices;
	HRESULT    hr;

	hr	= pD3DDevice->CreateVertexBuffer(sizeof(modelData), 0, D3DVERNORMAL::FVF, D3DPOOL_DEFAULT, &gVBuffer, NULL );
	if (FAILED(hr))
		return  FALSE;
	// 頂点バッファをコピー
	hr	= gVBuffer->Lock(0, sizeof(modelData), (LPVOID*)&lpVertices, 0);
	if (FAILED(hr))
		return FALSE;
	memcpy(lpVertices, modelData, sizeof(modelData));
	gVBuffer->Unlock();
	//-----------------------------------------
	//テクスチャ読み込み
	if( D3DXCreateTextureFromFile(pD3DDevice, L"../VertexShader/image01.bmp", &image01 ) != D3D_OK )
		image01	= NULL;
	return TRUE;
}
	:

初期化の部分でこのように書いてしまえば、わざわざプログラムを読み込まなくても使えるようになります。
ここにシェーダープログラムを書きます

	const char VertexShader[] =
		"vs_1_1\n"\
		"def c4, 0.0f,  0.5f,  1.0f,  0.20f\n"\
		"def c5, 0.566f,  0.566f,  0.566f,  0.0f\n"\
		"def c6, 1.0f,  0.5f,  0.0f,  0.0f\n"\
		"def c7, 0.0f,  0.0f,  0.5f,  0.0f\n"\
		"dcl_position	v0\n"\
		"dcl_normal		v1\n"\
		"m4x4	oPos, v0, c0\n"\
		"m3x3	r0, v1, c0\n"\
		"dp3	r0.w, r0, r0\n"\
		"rsq	r1, r0.w\n"\
		"mul	r0, r0, r1\n"\
		"mad	oT0.xy,r0.xy,c4.yy,c4.yy\n"\
		"dp3	r0.w, r0, c5\n"\
		"mad	r0.x, r0.w, c4.y, c4.y\n"\
		"sub	r0.y, c4.z, r0.x\n"\
		"mul	r1, r0.x, c6\n"\
		"mad	oD0, r0.y, c7, r1\n"\
		"mul	r0.x, r0.x, r0.x\n"\
		"mul	r0.x, r0.x, r0.x\n"\
		"mul	oD1, r0.x, r0.x\n";

このプログラムを以下の部分で登録します。

	//-------------------------------------------------------------------
	ID3DXBuffer*    pshader;
	if ( FAILED(D3DXAssembleShader( VertexShader , sizeof(VertexShader) - 1, 0 , NULL , 0, &pshader , NULL )))
		return FALSE;
	if( FAILED(pD3DDevice->CreateVertexShader((DWORD*)pshader->GetBufferPointer(),&vShader) )){
		pshader->Release();
		return FALSE;
	}
	pshader->Release();

これで