CRsElementDesc& CVertexShader::Process( const std::shared_ptr<CMesh> pMesh ) { m_vsOutput.m_vertices.clear(); m_vsOutput.m_vertices.reserve( pMesh->m_nVerties ); m_vsOutput.m_localVertices.reserve( pMesh->m_nVerties ); Matrix4 wvpMatrix = m_worldMatrix * m_viewMatrix * m_projectionMatrix; for ( int i = 0; i < pMesh->m_nVerties; ++i ) { Vector4 position = pMesh->m_vertices[i]; m_vsOutput.m_localVertices.emplace_back( position.X, position.Y, position.Z ); if ( pMesh->m_coordinate == COORDINATE::OBJECT_COORDINATE ) { position.Transform( wvpMatrix ); } m_vsOutput.m_vertices.emplace_back( position ); } unsigned int key = 0; m_vsOutput.m_faces.clear(); for ( std::vector<Face>::iterator faceiter = pMesh->m_faces.begin( ); faceiter != pMesh->m_faces.end( ); ++faceiter ) { key = faceiter - pMesh->m_faces.begin( ); if ( m_vsOutput.m_faces.size( ) <= key ) { m_vsOutput.m_faces.emplace_back( ); m_vsOutput.m_faces[key].reserve( faceiter->m_indices.size( ) ); } for ( std::vector<int>::iterator indexiter = faceiter->m_indices.begin( ); indexiter != faceiter->m_indices.end( ); ++indexiter ) { m_vsOutput.m_faces[key].emplace_back( *indexiter ); } } m_vsOutput.m_coordinate = pMesh->m_coordinate; return m_vsOutput; }
void ModelRenderer::Render(const Camera* camera) { if(!_renders) return; // ワールド行列設定 Matrix SclMtx, RotMtx, PosMtx, WldMtx, WVPMtx; // 拡縮 D3DXMatrixScaling(&SclMtx, _scale.x, _scale.y, _scale.z); // 回転 : switch-case…クォータニオンか回転行列かXYZ指定か this->Evaluate(); RotMtx = this->_worldRotationMatrix; // 位置 D3DXMatrixTranslation(&PosMtx, _position.x, _position.y, _position.z); GraphicsManager::_device->SetRenderState(D3DRS_CULLMODE, _cullingState); // デバッグ用 //GraphicsManager::_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); // シェーダを使用する場合カメラのビュー行列(0)、プロジェクション行列(1)をワールド行列に合成 WldMtx = SclMtx * RotMtx * PosMtx; WVPMtx = WldMtx * camera->GetMatrix(ViewBehavior::VIEW) * camera->GetMatrix(ViewBehavior::PROJECTION); // カメラの座標をシェーダに使用するための行列変換 Matrix CamMtx = WldMtx * camera->GetMatrix(ViewBehavior::VIEW); D3DXMatrixInverse(&CamMtx, NULL, &CamMtx); auto eye = camera->GetEye(); Vector4 EyePos = Vector4(eye.x, eye.y, eye.z, 1); EyePos.Transform(CamMtx); D3DXVec4Normalize((D3DXVECTOR4*)&EyePos, (D3DXVECTOR4*)&EyePos); // シェーダ設定 _shader->SetTechnique(); // シェーダにワールド * ビュー * プロジェクション行列を渡す _shader->SetWVPMatrix(WVPMtx); // シェーダー特有の値の設定 _shader->ApplyEffect(RotMtx, EyePos); HRESULT hr; // 3D モデルのパーツ分ループして描画 for(size_t i = 0 ; i < _mesh->GetMaterialNumber(); i++) { // テクスチャが存在しない場合のカラー D3DXVECTOR4 color = D3DXVECTOR4(1.0,1.0,1.0,1.0); // 格パーツに対応するテクスチャを設定 // シェーダにテクスチャを渡す if(NULL != _textures[i]) { LPDIRECT3DTEXTURE9 texture = _textures[i]->GetTextureData(); // シェーダにカラーを渡す _shader->SetColor(_colorRGBA); _shader->SetTexture(texture); }else _shader->SetColor(color); // シェーダの使用開始 _shader->BeginShader(); // シェーダのパス設定 _shader->BeginPass(_addsBlend); // パーツの描画 if(SUCCEEDED(GraphicsManager::_device->BeginScene())) { _mesh->GetMesh()->DrawSubset(i); V(GraphicsManager::_device->EndScene()); } // パス終了 _shader->EndPass(); // シェーダ終了 _shader->EndShader(); } }
void GraphicalPlane::Render(const Camera* camera) { // 描画しないならここで関数終了 if(!_renders) return; // 分割読み込みした場合の画像範囲選択 if(_previousNumber != _number) { Vertex* vertex; _mesh->GetMesh()->LockVertexBuffer( 0, (void**)&vertex ); vertex[0]._uv.x = (float)_rects[_number].left / _textures[0]->GetImageInfo().Width; vertex[0]._uv.y = (float)_rects[_number].bottom / _textures[0]->GetImageInfo().Height; vertex[1]._uv.x = (float)_rects[_number].right / _textures[0]->GetImageInfo().Width; vertex[1]._uv.y = (float)_rects[_number].bottom / _textures[0]->GetImageInfo().Height; vertex[2]._uv.x = (float)_rects[_number].left / _textures[0]->GetImageInfo().Width; vertex[2]._uv.y = (float)_rects[_number].top / _textures[0]->GetImageInfo().Height; vertex[3]._uv.x = (float)_rects[_number].right / _textures[0]->GetImageInfo().Width; vertex[3]._uv.y = (float)_rects[_number].top / _textures[0]->GetImageInfo().Height; _mesh->GetMesh()->UnlockIndexBuffer(); _previousNumber = _number; } // ワールド行列設定 Matrix SclMtx, RotMtx, PosMtx, WldMtx, WVPMtx; // 拡縮 D3DXMatrixScaling(&SclMtx, _scale.x, _scale.y, _scale.z); // 回転 // クォータニオンか回転行列かXYZ指定か this->Evaluate(); RotMtx = _worldRotationMatrix; // ビルボードの場合 if(_isBillBoard) { Vector3 cameraPosition = camera->GetEye() ; GetBillBoardRotation(&_position, &cameraPosition, &RotMtx); } // 位置 D3DXMatrixTranslation(&PosMtx, _position.x, _position.y, _position.z); // カリングを設定 GraphicsManager::_device->SetRenderState(D3DRS_CULLMODE, _cullingState); // デバッグ用 //GraphicsManager::_device->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME ); // シェーダを使用する場合カメラのビュー行列(0)、プロジェクション行列(1)をワールド行列に合成 WldMtx = SclMtx * RotMtx * PosMtx; WVPMtx = WldMtx * camera->GetMatrix(ViewBehavior::VIEW) * camera->GetMatrix(ViewBehavior::PROJECTION); // カメラの座標をシェーダに使用するための行列変換 Matrix CamMtx = WldMtx * camera->GetMatrix(ViewBehavior::VIEW); D3DXMatrixInverse(&CamMtx, NULL, &CamMtx); Vector4 EyePos = Vector4( camera->GetEye().x, camera->GetEye().y, camera->GetEye().z, 1 ); EyePos.Transform(CamMtx); D3DXVec4Normalize((D3DXVECTOR4*)&EyePos, (D3DXVECTOR4*)&EyePos); // シェーダ設定 _shader->SetTechnique(); // シェーダにワールド * ビュー * プロジェクション行列を渡す _shader->SetWVPMatrix(WVPMtx); // シェーダー特有の値の設定 _shader->ApplyEffect(RotMtx, EyePos); HRESULT hr; // 3D モデルのパーツ分ループして描画 for(size_t i = 0 ; i < _mesh->GetMaterialNumber(); i++) { // テクスチャが存在しない場合のカラー D3DXVECTOR4 vec4 = D3DXVECTOR4(1.0,1.0,1.0,1.0); // 格パーツに対応するテクスチャを設定 // シェーダにテクスチャを渡す if(NULL != _textures[i]) { LPDIRECT3DTEXTURE9 texture = _textures[i]->GetTextureData(); // シェーダにカラーを渡す _shader->SetColor(_colorRGBA); _shader->SetTexture(texture); }else _shader->SetColor(vec4); // シェーダの使用開始 _shader->BeginShader(); // シェーダのパス設定 _shader->BeginPass(_addsBlend); // パーツの描画 if(SUCCEEDED(GraphicsManager::_device->BeginScene())) { _mesh->GetMesh()->DrawSubset(i); V(GraphicsManager::_device->EndScene()); } // パス終了 _shader->EndPass(); // シェーダ終了 _shader->EndShader(); } }
Vector4 operator*(const Matrix4 &lhs, const Vector4 &rhs) { return Vector4(rhs.Transform(lhs)); }