VertexShader 法線テスト+平行色光源

VertexShader 法線テスト」のVertexShaderをいろいろと編集してみます。
昨日のソースには光源に色がなかったので、今回はその部分を追加してみます。
■その1
vsample01.vsh

//c0-c3		ビュー+透視変換マトリックス
//c4		汎用
//c5		平行光源
//c6		光源の色
//
//v0		頂点の座標値
//v1		法線情報

vs_1_1              // バージョン命令

def c4, 0.0f, 0.5f, 1.0f, 2.0f		//	汎用固定値
def c5, 0.707f,  0.707f,  0.0f,  0.5f	//	光向き
def c6, 0.0f,  1.0f,  0.0f,  0.0f		//	光源色

dcl_position	v0     // 座標頂点宣言
dcl_normal	v1     // 法線

m4x4	oPos, v0, c0

m3x3	r0, v1, c0
dp3	r0.w, r0, c5		//	-1 < r0.w < 1
mad	r0.x, r0.w, c4.y, c4.y	//	0 < r0.x < 1 ( r0.x = r0.w * 0.5f + 0.5f )
mul	oD0, r0.x, c6		//	光源色を掛ける

c6に光源の色を指定して、表示、これで



■その2
光源の色をCPPのプログラムから指定できるようにしたソースが以下の物になります
vsample01.vsh

//c0-c3		ビュー+透視変換マトリックス
//c4		汎用
//c5		平行光源
//c6		光源の色
//
//v0		頂点の座標値
//v1		法線情報

vs_1_1              // バージョン命令

def c4, 0.0f, 0.5f, 1.0f, 2.0f		//	汎用固定値
def c5, 0.707f,  0.707f,  0.0f,  0.5f	//	光向き

dcl_position	v0     // 座標頂点宣言
dcl_normal	v1     // 法線

m4x4	oPos, v0, c0

m3x3	r0, v1, c0
dp3	r0.w, r0, c5		//	-1 < r0.w < 1
mad	r0.x, r0.w, c4.y, c4.y	//	0 < r0.x < 1 ( r0.x = r0.w * 0.5f + 0.5f )
mul	oD0, r0.x, c6		//	光源色を掛ける

G9lib.cpp

	:
//------------------------------------------------------------------------------
//■テスト描画
//------------------------------------------------------------------------------
void	G9lib::TestDraw()
{
	D3DXMATRIX      matView;
	D3DXMATRIX      matProj;
	D3DXMATRIX      matWorld;

	pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0, 0);

	pD3DDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CCW );	//	片面
	pD3DDevice->SetRenderState( D3DRS_LIGHTING,FALSE);		//	光源無効

	pD3DDevice->BeginScene();
	//-----------------------------------------
	D3DXMatrixRotationY( &matWorld,timeGetTime()/5000.0f );
	D3DXMatrixLookAtLH(&matView,&D3DXVECTOR3(0.0f, -5.0f, 30.0f),	//	カメラの位置を表す3次元ベクトル
                                &D3DXVECTOR3(0.0f, 0.0f, 0.0f),		//	カメラの注視点を表す3次元ベクトル
                                &D3DXVECTOR3(0.0f, 1.0f, 0.0f));	//	上方向を表す3次元ベクトル
	D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 10.0f, 2000.0f );

	//-----------------------------------------
	D3DXMATRIX  m;
	D3DXMatrixTranspose(&m,&(matWorld * matView * matProj));	//転置行列 に変換
	pD3DDevice->SetVertexShaderConstantF(0,(float*)&m,4);		//視点・透視変換

	// ライトのc6 レジスタの設定
	float	color1[]	={ 0.0f, 1.0f, 0.0f, 0.0f };	//	光源の色
	pD3DDevice->SetVertexShaderConstantF( 6 , (float*)&color1 , 1 );
	//-----------------------------------------
	//	モデル登録
	pD3DDevice->SetVertexShader(vShader);                  

	pD3DDevice->SetFVF(D3DVERNORMAL::FVF);
	pD3DDevice->SetStreamSource( 0, gVBuffer, 0, sizeof(D3DVERNORMAL) );
	pD3DDevice->DrawPrimitive( D3DPT_TRIANGLELIST , 0, sizeof(modelData)/sizeof(D3DVERNORMAL)/3 );
	//-----------------------------------------
	//	描画
	pD3DDevice->EndScene();
	pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

以下の部分でシェーダに光源の色を渡すようにしています。

// ライトのc6 レジスタの設定
float	color1[]	={ 0.0f, 1.0f, 0.0f, 0.0f };	//	光源の色
pD3DDevice->SetVertexShaderConstantF( 6 , (float*)&color1 , 1 );