転置行列
「DirectX9 VertexShader」では、シェーダにマトリックスを与える前に転置行列の計算をしていたのですが、シェーダ内部で計算するようにしてみました。
vsample01.vsh
//c0-c3 ビュー+透視変換マトリックス // //v0 頂点の座標値 //v1 色情報 vs.2.0 dcl_position v0 dcl_color v1 mov oD0,v1 mul r0, c0, v0.x mad r0, c1, v0.y, r0 mad r0, c2, v0.z, r0 mad oPos, c3, v0.w, r0
G9Lib
: : //------------------------------------------------------------------------------ //■テスト描画 //------------------------------------------------------------------------------ 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 ); // pD3DDevice->SetTransform( D3DTS_WORLD, &matWorld ); //----------------------------------------- //View 座標の設定 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次元ベクトル // pD3DDevice->SetTransform( D3DTS_VIEW, &matView ); //----------------------------------------- //透視変換の設定 D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 10.0f, 2000.0f ); // pD3DDevice->SetTransform( D3DTS_PROJECTION, &matProj ); //----------------------------------------- // Z値に関して pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE); pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); pD3DDevice->SetVertexShader(vShader); pD3DDevice->SetVertexShaderConstantF(0,(float*)&(matWorld * matView * matProj),4); //視点・透視変換 pD3DDevice->SetFVF(D3DVERTEXCOR::FVF); //頂点フォーマット設定 pD3DDevice->SetStreamSource(0,gVBuffer,0,sizeof(D3DVERTEXCOR)); pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,4); //----------------------------------------- // 描画 pD3DDevice->EndScene(); pD3DDevice->Present(NULL, NULL, NULL, NULL); }
これでシェーダー内部で計算するようになるので、うまく扱えば高速化できるのではないかな?