//***************************************************************************** // 描画関数 //***************************************************************************** void CSceneX::DrawNormalRender(void) { D3DXMATERIAL *pD3DXMat; D3DMATERIAL9 matDef; // 元のマテリアル情報を保存しておく D3DXMATRIX mtxScl,mtxRot,mtxTranslate, mtxWVP; // ワールドマトリックスの初期化 D3DXMatrixIdentity(&m_mtxWorld); // スケールを反映 D3DXMatrixScaling(&mtxScl, m_vScl.x, m_vScl.y, m_vScl.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxScl); // 回転を反映 *****順番注意***** D3DXMatrixRotationYawPitchRoll(&mtxRot, m_Rot.y, m_Rot.x, m_Rot.z); // Y軸を基点に回転しているのでY,X,Zの順に入れる D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxRot); // 位置を反映 D3DXMatrixTranslation(&mtxTranslate, m_Pos.x, m_Pos.y, m_Pos.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxTranslate); // ワールドマトリックスの設定 (*m_pD3DDevice)->SetTransform(D3DTS_WORLD, &m_mtxWorld); // シェーダーの適用 LPDIRECT3DVERTEXSHADER9* _vs = CShader::GetVS(VS_TYPE_MODEL); LPD3DXCONSTANTTABLE* _vsc = CShader::GetVSC(VS_TYPE_MODEL); PS_TYPE type = PS_TYPE_MODEL; LPDIRECT3DPIXELSHADER9* _ps = CShader::GetPS(type); LPD3DXCONSTANTTABLE* _psc = CShader::GetPSC(type); (*m_pD3DDevice)->SetVertexShader(*_vs); (*m_pD3DDevice)->SetPixelShader(*_ps); HRESULT hr = 0; UINT texSampler = (*_psc)->GetSamplerIndex("texSampler"); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); UINT depthSampler = (*_psc)->GetSamplerIndex("depthSampler"); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); hr = (*m_pD3DDevice)->SetSamplerState(depthSampler, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); LPDIRECT3DTEXTURE9* pDepthTex = CRenderer::GetRenderTexture(CRenderer::TYPE_RENDER_TOON_OBJECT_DEPTH); hr = (*m_pD3DDevice)->SetTexture(depthSampler, *pDepthTex); D3DXMATRIX view, proj; CCameraManager* pCameraManager = m_pManager->GetCameraManager(); view = pCameraManager->GetMtxView(); proj = pCameraManager->GetMtxProj(); mtxWVP = m_mtxWorld * view * proj; hr = (*_vsc)->SetMatrix((*m_pD3DDevice), "gWVP", &mtxWVP); // ライトから見たの view = pCameraManager->GetMtxLightView(); proj = pCameraManager->GetMtxLightProj(); mtxWVP = m_mtxWorld * view * proj; hr = (*_vsc)->SetMatrix((*m_pD3DDevice), "gLightWVP", &mtxWVP); // 頂点宣言したやつをセット(SetFVFの代わり) (*m_pD3DDevice)->SetVertexDeclaration(m_ModelInfo->m_pDecl); // マテリアルのバッファ取得 pD3DXMat = (D3DXMATERIAL*)m_ModelInfo->pD3DXBuffMatModel->GetBufferPointer(); // 現在のマテリアルの情報を取得 (*m_pD3DDevice)->GetMaterial(&matDef); // マテリアルの描画 for (int nCntMat = 0; nCntMat < (int)m_ModelInfo->nNumMatModel; nCntMat++) { LPDIRECT3DTEXTURE9 pTex = m_ModelInfo->pD3DTexBuff[nCntMat]; hr = (*m_pD3DDevice)->SetTexture(texSampler, pTex); m_ModelInfo->pD3DXMeshModel->DrawSubset(nCntMat); // モデルのパーツを描画 } //*********注意:以下を必ず書くこと****************** // 書かないとすべての色がおかしくなる (*m_pD3DDevice)->SetMaterial(&matDef); // マテリアル情報を元に戻す (*m_pD3DDevice)->SetTexture(texSampler, NULL); (*m_pD3DDevice)->SetTexture(depthSampler, NULL); (*m_pD3DDevice)->SetVertexShader(NULL); (*m_pD3DDevice)->SetPixelShader(NULL); }
//***************************************************************************** // 描画関数 //***************************************************************************** void CRope::DrawNormalRender(void) { D3DXMATRIX mtxScl, mtxRot, mtxTranslate, mtxWVP; // ワールドマトリックスの初期化 D3DXMatrixIdentity(&m_mtxWorld); // スケールを反映 D3DXMatrixScaling(&mtxScl, m_vScl.x, m_vScl.y, m_vScl.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxScl); // 回転を反映 *****順番注意***** D3DXMatrixRotationYawPitchRoll(&mtxRot, m_Rot.y, m_Rot.x, m_Rot.z); // Y軸を基点に回転しているのでY,X,Zの順に入れる D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxRot); // 位置を反映 D3DXMatrixTranslation(&mtxTranslate, m_Pos.x, m_Pos.y, m_Pos.z); D3DXMatrixMultiply(&m_mtxWorld, &m_mtxWorld, &mtxTranslate); // シェーダーの適用 LPDIRECT3DVERTEXSHADER9* _vs = CShader::GetVS(VS_TYPE_TEX); LPD3DXCONSTANTTABLE* _vsc = CShader::GetVSC(VS_TYPE_TEX); PS_TYPE type = PS_TYPE_TEX; LPDIRECT3DPIXELSHADER9* _ps = CShader::GetPS(type); LPD3DXCONSTANTTABLE* _psc = CShader::GetPSC(type); (*m_pD3DDevice)->SetVertexShader(*_vs); (*m_pD3DDevice)->SetPixelShader(*_ps); UINT texSampler = (*_psc)->GetSamplerIndex("texSampler"); HRESULT hr = 0; hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP); hr = (*m_pD3DDevice)->SetSamplerState(texSampler, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP); D3DXMATRIX view, proj; CCameraManager* pCameraManager = m_pManager->GetCameraManager(); view = pCameraManager->GetMtxView(); proj = pCameraManager->GetMtxProj(); mtxWVP = m_mtxWorld * view * proj; hr = (*_vsc)->SetMatrix((*m_pD3DDevice), "gWVP", &mtxWVP); // テクスチャの設定(2つ目の引数をNULLにするとテクスチャを描画しない (*m_pD3DDevice)->SetTexture(0, m_pD3DTexBuff); // 両面カリングしちゃえ (*m_pD3DDevice)->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // ポリゴンの描画 hr = (*m_pD3DDevice)->SetVertexDeclaration(m_pDecl); // 頂点フォーマットの設定 (*m_pD3DDevice)->SetStreamSource(0, m_pD3DVtxBuff, 0, sizeof(VF)); // (0,渡すものが入ってるやつ,0,データの型指定) (*m_pD3DDevice)->SetIndices(m_pD3DIndexBuff); // インデックスの設定 (*m_pD3DDevice)->DrawIndexedPrimitive(D3DPT_TRIANGLESTRIP // プリミティブの種類 , 0 , 0 , m_nNumVtxNum // 総頂点数 , 0 , m_nNumPolygon); (*m_pD3DDevice)->SetTexture(texSampler, NULL); (*m_pD3DDevice)->SetVertexShader(NULL); (*m_pD3DDevice)->SetPixelShader(NULL); (*m_pD3DDevice)->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); }