VertexShader 法線テスト+ダークカラー+スペキュラ
「VertexShader 法線テスト」を参考に
まずはスペキュラの設定をONにします。
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->SetRenderState( D3DRS_SPECULARENABLE, TRUE ); // スペキュラON 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); //視点・透視変換 //----------------------------------------- // モデル登録 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); }
スペキュラをONにするにはこの1行を足しています。
pD3DDevice->SetRenderState( D3DRS_SPECULARENABLE, TRUE ); // スペキュラON
シェーダーの方ですが
vsample01.vsh
//c0-c3 ビュー+透視変換マトリックス //c4 汎用固定値 //c5 平行光源向き //c6 光源色 //c7 ダークカラー // //v0 頂点の座標値 //v1 法線情報 vs_1_1 // バージョン命令 def c4, 0.0f, 0.5f, 1.0f, 2.0f // 汎用固定値 def c5, 0.566f, 0.566f, 0.566f, 0.0f // 光源 def c6, 1.0f, 0.0f, 0.0f, 0.0f // 光源色 def c7, 0.0f, 0.0f, 0.3f, 0.0f // ダークカラー dcl_position v0 // 座標頂点宣言 dcl_normal v1 // 法線 m4x4 oPos, v0, c0 // 頂点の設定 m3x3 r0, v1, c0 dp3 r0.w, r0, c5 mad r0.x, r0.w, c4.y, c4.y sub r0.y, c4.z, r0.x // r1.z = 1.0 - r1.y mul r1, r0.x, c6 mad oD0, r0.y, c7, r1 // 頂点カラー設定 mad oD1, r0.x, r0.x, -c4.z // スペキュラ値設定
最後にoD1にスペキュラ値を入れます、今回は適当な数値を入れてます(r0.xの1以上の成分をスペキュラ成分として使用しました)