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 );