//シェーダリソースビューの作成 ComPtr<ID3D11ShaderResourceView> GameObject::CreateShaderResView(const wstring& TextureFileName){ //テクスチャ作成 DirectX::TexMetadata metadata; DirectX::ScratchImage image; ThrowIfFailed( DirectX::LoadFromWICFile(TextureFileName.c_str(), 0, &metadata, image), L"テクスチャの読み込みに失敗しました", TextureFileName, L"GameObject::CreateShaderResView()" ); //デバイスとコンテキストインターフェイスの取得 //デバイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); ID3D11Device* pDx11Device = Dev->GetD3DDevice(); ID3D11DeviceContext* pID3D11DeviceContex = Dev->GetD3DDeviceContext(); //ミューテックス std::mutex Mutex; ComPtr<ID3D11ShaderResourceView> ResView; Util::DemandCreate(ResView, Mutex, [&](ID3D11ShaderResourceView** pResult) -> HRESULT { // 画像からシェーダリソースViewの作成 return ThrowIfFailed(CreateShaderResourceView(pDx11Device, image.GetImages(), image.GetImageCount(), metadata, pResult), L"シェーダーリソースビューを作成できません", L"if( FAILED( CreateShaderResourceView() ) )", L"Texture::Impl::Impl()" ); }); return ResView; }
//レンダリングターゲットを開始する void DefaultRenderTarget::StartRenderTarget(){ auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); ID3D11RenderTargetView* pV = pImpl->m_D3D11RenderTargetView.Get(); //レンダリングターゲットとステンシルを設定 pD3D11DeviceContext->OMSetRenderTargets(1, &pV, pImpl->m_DepthStencilView.Get()); //ビューポートの設定 if (pImpl->m_Stage.expired()){ throw BaseException( L"ステージが無効です", L"if (pImpl->m_Stage.expired())", L"DefaultRenderTarget::StartRenderTarget()" ); } auto StagePtr = pImpl->m_Stage.lock(); pD3D11DeviceContext->RSSetViewports(1, StagePtr->GetTargetViewPortRealPtr()); //シェーダーリソースビューのクリア ID3D11ShaderResourceView* pNull[1] = { nullptr }; pD3D11DeviceContext->PSSetShaderResources(0, _countof(pNull), pNull); pD3D11DeviceContext->PSSetShaderResources(1, _countof(pNull), pNull); //シェーダーは指定しない pD3D11DeviceContext->VSSetShader(nullptr, nullptr, 0); pD3D11DeviceContext->PSSetShader(nullptr, nullptr, 0); pD3D11DeviceContext->GSSetShader(nullptr, nullptr, 0); //ブレンドは指定しない pD3D11DeviceContext->OMSetBlendState(nullptr, nullptr, 0xffffffff); }
//レンダリングターゲットをクリアする void ShadowMapRenderTarget::ClearViews(){ auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //シャドウマップクリア pD3D11DeviceContext->ClearDepthStencilView(pImpl->m_DepthStencilView.Get(), D3D11_CLEAR_DEPTH, 1.0, 0); }
void rxRenderer::EndScene() { Assert( gCurrentViewport != nil ); gData->drawHelper.Flush(); ID3D11DeviceContext* pD3DContext = GetD3DDeviceContext(); gCurrentViewport->swapChain->Present( 0, // UINT SyncInterval 0 // UINT Flags ); pD3DContext->ClearState(); gCurrentViewport = nil; // Resize viewports if needed. if( RX_DEFER_VIEWPORTS_RESIZING ) { if( gResizeViewportsUtil.ShouldResizeViewports() ) { rxViewportManager::ResizeViewports(); } }//RX_DEFER_VIEWPORTS_RESIZING }
void rxRenderer::BeginScene( rxViewport* viewport, const rxFrameContext& frameContext ) { Assert( gCurrentViewport == nil ); AssertPtr( viewport ); gCurrentViewport = viewport; ID3D11DeviceContext* pD3DContext = GetD3DDeviceContext(); const GrViewport & vp = *viewport; Assert(vp.CheckIsOk()); pD3DContext->ClearRenderTargetView( vp.mainRT.pRTV, frameContext.clearColor.ToFloatPtr() ); // Depth-stencil is optional. if( vp.mainDS.pDSV != nil ) { pD3DContext->ClearDepthStencilView( vp.mainDS.pDSV, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, // depth buffer value 0 // UINT8 stencil value ); } }
void SpriteBase::OnUpdate() { float ElapsedTime = App::GetApp()->GetElapsedTime(); auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //頂点の変更 //D3D11_MAP_WRITE_DISCARDは重要。この処理により、GPUに邪魔されない D3D11_MAP mapType = D3D11_MAP_WRITE_DISCARD; D3D11_MAPPED_SUBRESOURCE mappedBuffer; //頂点のマップ if (FAILED(pD3D11DeviceContext->Map(m_SquareMesh->GetVertexBuffer().Get(), 0, mapType, 0, &mappedBuffer))) { // Map失敗 throw BaseException( L"頂点のMapに失敗しました。", L"if(FAILED(pID3D11DeviceContext->Map()))", L"WrappedSprite::UpdateVertex()" ); } //頂点の変更 VertexPositionColorTexture* vertices = (VertexPositionColorTexture*)mappedBuffer.pData; //仮想関数呼び出し UpdateVertex(ElapsedTime, vertices); //アンマップ pD3D11DeviceContext->Unmap(m_SquareMesh->GetVertexBuffer().Get(), 0); }
void SimpleSquare::OnUpdate() { float ElapsedTime = App::GetApp()->GetElapsedTime(); auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //頂点の変更 //D3D11_MAP_WRITE_DISCARDは重要。この処理により、GPUに邪魔されない D3D11_MAP mapType = D3D11_MAP_WRITE_DISCARD; D3D11_MAPPED_SUBRESOURCE mappedBuffer; //頂点のマップ if (FAILED(pD3D11DeviceContext->Map(m_SquareMesh->GetVertexBuffer().Get(), 0, mapType, 0, &mappedBuffer))) { // Map失敗 throw BaseException( L"頂点のMapに失敗しました。", L"if(FAILED(pID3D11DeviceContext->Map()))", L"SimpleSquare::OnUpdate()" ); } //頂点の変更 VertexPositionColorTexture* vertices = (VertexPositionColorTexture*)mappedBuffer.pData; //関数呼び出し UpdateVertex(ElapsedTime, vertices); //アンマップ pD3D11DeviceContext->Unmap(m_SquareMesh->GetVertexBuffer().Get(), 0); auto PtrStage = GetStage<Stage>(); //カメラの位置 Vec3 CameraEye = PtrStage->GetCamera().m_CamerEye; Vec3 CameraAt = PtrStage->GetCamera().m_CamerAt; switch (m_DrawOption) { case SquareDrawOption::Billboard: { m_Qt.facing(CameraAt - CameraEye); } break; case SquareDrawOption::Faceing: { m_Qt.facing(m_Pos - CameraEye); } break; case SquareDrawOption::FaceingY: m_Qt.facingY(m_Pos - CameraEye); break; default: m_Qt.normalize(); break; } }
//レンダリングターゲットを終了する void DefaultRenderTarget::EndRenderTarget(){ auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //ステータスのポインタ //auto RenderStatePtr = App::GetApp()->GetRenderState(); //シェーダーリソースビューのクリア ID3D11ShaderResourceView* pNull[1] = { nullptr }; pD3D11DeviceContext->PSSetShaderResources(0, _countof(pNull), pNull); pD3D11DeviceContext->PSSetShaderResources(1, _countof(pNull), pNull); //シェーダーは指定しない pD3D11DeviceContext->VSSetShader(nullptr, nullptr, 0); pD3D11DeviceContext->PSSetShader(nullptr, nullptr, 0); pD3D11DeviceContext->GSSetShader(nullptr, nullptr, 0); //ブレンドは指定しない pD3D11DeviceContext->OMSetBlendState(nullptr, nullptr, 0xffffffff); }
//レンダリングターゲットを終了する void ShadowMapRenderTarget::EndRenderTarget(){ //デバイスとコンテキストインターフェイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //レンダリングターゲットは深度ステンシルビューのみ指定 ID3D11RenderTargetView* pnullView = nullptr; pD3D11DeviceContext->OMSetRenderTargets(1, &pnullView, nullptr); //ビューポートの設定 pD3D11DeviceContext->RSSetViewports(1, &pImpl->m_ViewPort); //ラスタライザステートの設定(設定解除) pD3D11DeviceContext->RSSetState(nullptr); //シェーダーは指定しない //頂点シェーダの設定(ここでは指定しない) pD3D11DeviceContext->VSSetShader(nullptr, nullptr, 0); //ピクセルシェーダの設定(使用しない) pD3D11DeviceContext->PSSetShader(nullptr, nullptr, 0); //ジオメトリシェーダの設定(使用しない) pD3D11DeviceContext->GSSetShader(nullptr, nullptr, 0); }
//操作 //スクリーン全体を指定の色でクリアする void DefaultRenderTarget::ClearViews(){ auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //バッファのクリア float Color[4] = { 0, 0, 0,1.0f }; D3D11_VIEWPORT ViewPort; //ビューポートのセットアップ ZeroMemory(&ViewPort, sizeof(ViewPort)); ViewPort.Width = (float)App::GetApp()->GetGameWidth(); ViewPort.Height = (float)App::GetApp()->GetGameHeight(); ViewPort.MinDepth = 0.0f; ViewPort.MaxDepth = 1.0f; ViewPort.TopLeftX = 0; ViewPort.TopLeftY = 0; pD3D11DeviceContext->RSSetViewports(1, &ViewPort); //レンダリングターゲットのクリア pD3D11DeviceContext->ClearRenderTargetView(pImpl->m_D3D11RenderTargetView.Get(), Color); //通常の深度バッファとステンシルバッファのクリア pD3D11DeviceContext->ClearDepthStencilView(pImpl->m_DepthStencilView.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0); }
void GameObject::Draw(){ //ゲームステージが無効ならリターン if (m_GameStgae.expired()){ return; } //デバイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pDx11Device = Dev->GetD3DDevice(); auto pID3D11DeviceContext = Dev->GetD3DDeviceContext(); //ステータスのポインタ auto RenderStatePtr = Dev->GetRenderState(); auto Stage = m_GameStgae.lock(); auto ViewPtr = Stage->GetView(); //ビューからカメラを取り出す auto PtrCamera = ViewPtr->GetCamera(); //カメラの取得 Matrix4X4 View, Proj; View = PtrCamera->GetViewMatrix(); Proj = PtrCamera->GetProjMatrix(); //コンスタントバッファの設定 Texture3DConstantBuffer cb1; //行列の設定(転置する) cb1.Model = Matrix4X4EX::Transpose(m_WorldMatrix); cb1.View = Matrix4X4EX::Transpose(View); cb1.Projection = Matrix4X4EX::Transpose(Proj); //ライトの設定 //ステージから0番目のライトを取り出す auto PtrLight = ViewPtr->GetMultiLight()->GetLight(0); cb1.LightDir = PtrLight->GetDirectional(); cb1.LightDir.w = 1.0f; //コンスタントバッファの更新 pID3D11DeviceContext->UpdateSubresource(CBTexture3D::GetPtr()->GetBuffer(), 0, nullptr, &cb1, 0, 0); //ストライドとオフセット UINT stride = sizeof(VertexPositionNormalTexture); UINT offset = 0; //頂点バッファの設定 pID3D11DeviceContext->IASetVertexBuffers(0, 1, m_VertexBuffer.GetAddressOf(), &stride, &offset); //インデックスバッファのセット pID3D11DeviceContext->IASetIndexBuffer(m_IndexBuffer.Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pID3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //透明処理 pID3D11DeviceContext->OMSetBlendState(RenderStatePtr->GetAlphaBlendEx(), nullptr, 0xffffffff); //デプスステンシルは使用する pID3D11DeviceContext->OMSetDepthStencilState(RenderStatePtr->GetDepthDefault(), 0); //シェーダの設定 pID3D11DeviceContext->VSSetShader(VSTexture3D::GetPtr()->GetShader(), nullptr, 0); pID3D11DeviceContext->PSSetShader(PSTexture3D::GetPtr()->GetShader(), nullptr, 0); //リニアサンプラーを設定 ID3D11SamplerState* samplerState = RenderStatePtr->GetLinearClamp(); pID3D11DeviceContext->PSSetSamplers(0, 1, &samplerState); for (auto& m : m_Materials){ //テクスチャを設定 pID3D11DeviceContext->PSSetShaderResources(0, 1, m.m_ShaderResView.GetAddressOf()); //インプットレイアウトの設定 pID3D11DeviceContext->IASetInputLayout(VSTexture3D::GetPtr()->GetInputLayout()); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = CBTexture3D::GetPtr()->GetBuffer(); pID3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); pID3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullFront()); //描画 pID3D11DeviceContext->DrawIndexed(m.m_IndexCount, m.m_StartIndex, 0); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullBack()); //描画 pID3D11DeviceContext->DrawIndexed(m.m_IndexCount, m.m_StartIndex,0); } //後始末 Dev->InitializeStates(RenderStatePtr); }
//-------------------------------------------------------------------------------------- // class DefaultRenderTarget : public RenderTarget; // 用途: デフォルトのレンダーターゲット // *デフォルトのレンダラー //-------------------------------------------------------------------------------------- //構築 DefaultRenderTarget::DefaultRenderTarget(const shared_ptr<Stage>& stage) : pImpl(new Impl(stage)) { try{ if (pImpl->m_Stage.expired()){ throw BaseException( L"ステージが無効です", L"if (pImpl->m_Stage.expired())", L"DefaultRenderTarget::DefaultRenderTarget()" ); } auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pSwapChain = Dev->GetSwapChain(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); auto pD2D11DeviceContext = Dev->GetD2DDeviceContext(); //レンダリングターゲットビューの作成 ComPtr<ID3D11Texture2D> pBackBuffer; //まずバックバッファのポインタを得る ThrowIfFailed( pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer), L"スワップチェーンからバックバッファの取得に失敗しました。", L"pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&pBackBuffer)", L"DefaultRenderTarget::DefaultRenderTarget()" ); //バックバッファからレンダリングターゲットのビューを作成する ThrowIfFailed( pD3D11Device->CreateRenderTargetView(pBackBuffer.Get(), nullptr, &pImpl->m_D3D11RenderTargetView), L"DX11バックバッファからのレンダリングターゲットビューを作成に失敗しました。", L"pD3D11Device->CreateRenderTargetView(pBackBuffer.Get(), nullptr, &m_D3D11RenderTargetView)", L"DefaultRenderTarget::DefaultRenderTarget()" ); //深度テクスチャの作成 D3D11_TEXTURE2D_DESC descDepth; ZeroMemory(&descDepth, sizeof(descDepth)); descDepth.Width = App::GetApp()->GetGameWidth(); descDepth.Height = App::GetApp()->GetGameHeight(); descDepth.MipLevels = 1; descDepth.ArraySize = 1; descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; descDepth.SampleDesc.Count = 1; descDepth.SampleDesc.Quality = 0; descDepth.Usage = D3D11_USAGE_DEFAULT; descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; descDepth.CPUAccessFlags = 0; descDepth.MiscFlags = 0; ThrowIfFailed( pD3D11Device->CreateTexture2D(&descDepth, nullptr, &pImpl->m_DepthStencil), L"DX11深度テクスチャの作成失敗の作成に失敗しました。", L"pD3D11Device->CreateTexture2D(&descDepth, nullptr, &m_DepthStencil)", L"DefaultRenderTarget::DefaultRenderTarget()" ); //深度ステンシルビューの作成 D3D11_DEPTH_STENCIL_VIEW_DESC descDSV; ZeroMemory(&descDSV, sizeof(descDSV)); descDSV.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; descDSV.Texture2D.MipSlice = 0; ThrowIfFailed( pD3D11Device->CreateDepthStencilView(pImpl->m_DepthStencil.Get(), &descDSV, &pImpl->m_DepthStencilView), L"DX11深度ステンシルビューの作成に失敗しました。", L"pD3D11Device->CreateDepthStencilView(m_DepthStencil.Get(), &descDSV, &m_DepthStencilView)", L"DefaultRenderTarget::DefaultRenderTarget()" ); ComPtr<IDXGISurface2> dxgiBackBuffer; ThrowIfFailed( pSwapChain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackBuffer)), L"2dデバイスコンテキスト作成に失敗しました。", L"m_d2dDevice->CreateDeviceContext()", L"DeviceResources::Impl::CreateDeviceResources()" ); ThrowIfFailed( pD2D11DeviceContext->CreateBitmapFromDxgiSurface( dxgiBackBuffer.Get(), nullptr, //デフォルト設定 &pImpl->m_d2dTargetBitmap ), L"2dビットマップ作成に失敗しました。", L"pD2D11DeviceContext->CreateBitmapFromDxgiSurface()", L"DefaultRenderTarget::DefaultRenderTarget()" ); pD2D11DeviceContext->SetTarget(pImpl->m_d2dTargetBitmap.Get()); //グレースケール テキストのアンチエイリアシング pD2D11DeviceContext->SetTextAntialiasMode(D2D1_TEXT_ANTIALIAS_MODE_GRAYSCALE); } catch (...){ throw; } }
//-------------------------------------------------------------------------------------- // class ShadowMapRenderTarget: public RenderTarget; // 用途: シャドウマップのレンダリングターゲット //-------------------------------------------------------------------------------------- //構築と破棄 ShadowMapRenderTarget::ShadowMapRenderTarget(float ShadowMapDimension) : pImpl(new Impl(ShadowMapDimension)) { try{ //デバイスとコンテキストインターフェイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11Device = Dev->GetD3DDevice(); auto pSwapChain = Dev->GetSwapChain(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); //シャドウマップテクスチャの作成 D3D11_TEXTURE2D_DESC shadowMapDesc; ZeroMemory(&shadowMapDesc, sizeof(D3D11_TEXTURE2D_DESC)); shadowMapDesc.Width = static_cast<UINT>(pImpl->m_ShadowMapDimension); shadowMapDesc.Height = static_cast<UINT>(pImpl->m_ShadowMapDimension); shadowMapDesc.MipLevels = 1; shadowMapDesc.ArraySize = 1; shadowMapDesc.SampleDesc.Count = 1; shadowMapDesc.Usage = D3D11_USAGE_DEFAULT; shadowMapDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE; shadowMapDesc.Format = DXGI_FORMAT_R24G8_TYPELESS; ThrowIfFailed( pD3D11Device->CreateTexture2D(&shadowMapDesc, nullptr, &pImpl->m_DepthStencil), L"シャドウマップテクスチャの作成に失敗しました。", L"pD3D11Device->CreateTexture2D(&shadowMapDesc, nullptr, &m_DepthStencil)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); //深度ステンシルビュー作成 D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc; ZeroMemory(&depthStencilViewDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC)); depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; depthStencilViewDesc.Texture2D.MipSlice = 0; ThrowIfFailed( pD3D11Device->CreateDepthStencilView(pImpl->m_DepthStencil.Get(), &depthStencilViewDesc, &pImpl->m_DepthStencilView), L"深度ステンシルビューの作成に失敗しました。", L"pD3D11Device->CreateDepthStencilView(&m_DepthStencil, &depthStencilViewDesc, &m_DepthStencilView)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); //シェーダーリソースビュー作成 D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc; ZeroMemory(&shaderResourceViewDesc, sizeof(D3D11_SHADER_RESOURCE_VIEW_DESC)); shaderResourceViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; shaderResourceViewDesc.Texture2D.MipLevels = 1; ThrowIfFailed( pD3D11Device->CreateShaderResourceView(pImpl->m_DepthStencil.Get(), &shaderResourceViewDesc, &pImpl->m_ShaderResourceView), L"シェーダーリソースビューの作成に失敗しました。", L"pD3D11Device->CreateShaderResourceView(m_DepthStencil.Get(), &shaderResourceViewDesc, &m_ShaderResourceView)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); D3D11_RASTERIZER_DESC shadowRenderStateDesc; ZeroMemory(&shadowRenderStateDesc, sizeof(D3D11_RASTERIZER_DESC)); shadowRenderStateDesc.CullMode = D3D11_CULL_FRONT; shadowRenderStateDesc.FillMode = D3D11_FILL_SOLID; shadowRenderStateDesc.DepthClipEnable = true; ThrowIfFailed(pD3D11Device->CreateRasterizerState(&shadowRenderStateDesc,&pImpl->m_ShadowRenderState), L"シャドウマップのラスタライザステートの作成に失敗しました。", L"pD3D11Device->CreateRasterizerState(&shadowRenderStateDesc,&pImpl->m_ShadowRenderState)", L"ShadowMapRenderTarget::ShadowMapRenderTarget()" ); //ビューポートの作成 //シャドウレンダリングビューポート ZeroMemory(&pImpl->m_ViewPort, sizeof(D3D11_VIEWPORT)); pImpl->m_ViewPort.Height = pImpl->m_ShadowMapDimension; pImpl->m_ViewPort.Width = pImpl->m_ShadowMapDimension; pImpl->m_ViewPort.MinDepth = 0.f; pImpl->m_ViewPort.MaxDepth = 1.f; } catch (...){ throw; } }
void CustomDrawBox::Draw(){ //デバイスの取得 auto Dev = App::GetApp()->GetDeviceResources(); auto pDx11Device = Dev->GetD3DDevice(); auto pID3D11DeviceContext = Dev->GetD3DDeviceContext(); //ステータスのポインタ auto RenderStatePtr = GetStage()->GetRenderState(); auto PtrT = GetComponent<Transform>(); //ステージからカメラを取り出す auto PtrCamera = GetStage()->GetTargetCamera(); //カメラの取得 Matrix4X4 View, Proj, WorldViewProj; View = PtrCamera->GetViewMatrix(); Proj = PtrCamera->GetProjMatrix(); //ストライドとオフセット UINT stride = sizeof(VertexPositionNormalTexture); UINT offset = 0; //頂点バッファの設定 auto PtrMeshResource = App::GetApp()->GetResource<MeshResource>(L"DEFAULT_CUBE"); pID3D11DeviceContext->IASetVertexBuffers(0, 1, PtrMeshResource->GetVertexBuffer().GetAddressOf(), &stride, &offset); //インデックスバッファのセット pID3D11DeviceContext->IASetIndexBuffer(PtrMeshResource->GetIndexBuffer().Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pID3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //ステータスのポインタ //テクスチャを取得 ID3D11ShaderResourceView* pNull[1] = { 0 }; ID3D11SamplerState* pNullSR[1] = { 0 }; //テクスチャを設定 auto PtrTextureResource = App::GetApp()->GetResource<TextureResource>(L"TRACE_TX"); pID3D11DeviceContext->PSSetShaderResources(0, 1, PtrTextureResource->GetShaderResourceView().GetAddressOf()); //リニアサンプラーを設定 ID3D11SamplerState* samplerState = RenderStatePtr->GetLinearClamp(); pID3D11DeviceContext->PSSetSamplers(0, 1, &samplerState); //半透明処理 pID3D11DeviceContext->OMSetBlendState(RenderStatePtr->GetAlphaBlendEx(), nullptr, 0xffffffff); //デプスステンシルは使用する pID3D11DeviceContext->OMSetDepthStencilState(RenderStatePtr->GetDepthDefault(), 0); //シェーダの設定 pID3D11DeviceContext->VSSetShader(m_VirtexShader->GetShader(), nullptr, 0); pID3D11DeviceContext->PSSetShader(m_PixelShader->GetShader(), nullptr, 0); //インプットレイアウトの設定 pID3D11DeviceContext->IASetInputLayout(m_VirtexShader->GetInputLayout()); //コンスタントバッファの設定 ConstantBuffer cb1; ZeroMemory(&cb1, sizeof(cb1)); //行列の設定(転置する) cb1.World = Matrix4X4EX::Transpose(PtrT->GetWorldMatrix());; cb1.View = Matrix4X4EX::Transpose(View); cb1.Projection = Matrix4X4EX::Transpose(Proj); //ライトの設定 //ステージから0番目のライトを取り出す auto PtrLight = GetStage()->GetTargetLight(0); cb1.LightDir = PtrLight->GetDirectional(); //xとzだけ逆にする cb1.LightDir.x *= -1.0f; cb1.LightDir.z *= -1.0f; cb1.LightDir.w = 1.0f; //トータルタイムをコンスタントバッファに渡す float ElapsedTime = App::GetApp()->GetElapsedTime(); m_TotalTime += ElapsedTime; if (m_TotalTime >= 1.0f){ m_TotalTime = 0.0f; } cb1.Param.x = m_TotalTime; //コンスタントバッファの更新 pID3D11DeviceContext->UpdateSubresource(m_ConstantBuffer->GetBuffer(), 0, nullptr, &cb1, 0, 0); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = m_ConstantBuffer->GetBuffer(); pID3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); pID3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullFront()); //内側描画 pID3D11DeviceContext->DrawIndexed(PtrMeshResource->GetNumIndicis(), 0, 0); //ライトの向きを変える cb1.LightDir = PtrLight->GetDirectional(); cb1.LightDir.w = 1.0f; //コンスタントバッファの更新 pID3D11DeviceContext->UpdateSubresource(m_ConstantBuffer->GetBuffer(), 0, nullptr, &cb1, 0, 0); //コンスタントバッファの設定 pConstantBuffer = m_ConstantBuffer->GetBuffer(); pID3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); pID3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //レンダリングステート pID3D11DeviceContext->RSSetState(RenderStatePtr->GetCullBack()); //描画(外側) pID3D11DeviceContext->DrawIndexed(PtrMeshResource->GetNumIndicis(), 0, 0); //後始末 Dev->InitializeStates(RenderStatePtr); }
void SpriteBase::OnDraw() { auto TexPtr = App::GetApp()->GetResource<TextureResource>(m_TextureResName); auto Dev = App::GetApp()->GetDeviceResources(); auto pD3D11DeviceContext = Dev->GetD3DDeviceContext(); auto RenderState = Dev->GetRenderState(); //ワールド行列の決定 Mat4x4 World; World.affineTransformation2D( m_Scale, //スケーリング Vec2(0, 0), //回転の中心(重心) m_Rot, //回転角度 m_Pos //位置 ); //射影行列の決定 float w = static_cast<float>(App::GetApp()->GetGameWidth()); float h = static_cast<float>(App::GetApp()->GetGameHeight()); Mat4x4 Proj(XMMatrixOrthographicLH(w, h, -1.0, 1.0f)); //行列の合成 World *= Proj; //コンスタントバッファの準備 SpriteConstantBuffer sb; //エミッシブ加算。 sb.Emissive = m_Emissive; //行列の設定 sb.World = World; //コンスタントバッファの更新 pD3D11DeviceContext->UpdateSubresource(CBSprite::GetPtr()->GetBuffer(), 0, nullptr, &sb, 0, 0); //ストライドとオフセット UINT stride = sizeof(VertexPositionColorTexture); UINT offset = 0; //頂点バッファのセット pD3D11DeviceContext->IASetVertexBuffers(0, 1, m_SquareMesh->GetVertexBuffer().GetAddressOf(), &stride, &offset); //インデックスバッファのセット pD3D11DeviceContext->IASetIndexBuffer(m_SquareMesh->GetIndexBuffer().Get(), DXGI_FORMAT_R16_UINT, 0); //描画方法(3角形) pD3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //コンスタントバッファの設定 ID3D11Buffer* pConstantBuffer = CBSprite::GetPtr()->GetBuffer(); ID3D11Buffer* pNullConstantBuffer = nullptr; //頂点シェーダに渡す pD3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer); //ピクセルシェーダに渡す pD3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer); //シェーダの設定 pD3D11DeviceContext->VSSetShader(VSPCTSprite::GetPtr()->GetShader(), nullptr, 0); pD3D11DeviceContext->PSSetShader(PSPCTSprite::GetPtr()->GetShader(), nullptr, 0); //インプットレイアウトの設定 pD3D11DeviceContext->IASetInputLayout(VSPCTSprite::GetPtr()->GetInputLayout()); //ブレンドステート switch (m_BlendState) { case BlendState::Opaque: pD3D11DeviceContext->OMSetBlendState(RenderState->GetOpaque(), nullptr, 0xffffffff); break; case BlendState::Trace: pD3D11DeviceContext->OMSetBlendState(RenderState->GetAlphaBlendEx(), nullptr, 0xffffffff); break; case BlendState::Additive: pD3D11DeviceContext->OMSetBlendState(RenderState->GetAdditive(), nullptr, 0xffffffff); break; } //デプスステンシルステート pD3D11DeviceContext->OMSetDepthStencilState(RenderState->GetDepthNone(), 0); //ラスタライザステート pD3D11DeviceContext->RSSetState(RenderState->GetCullBack()); //テクスチャとサンプラーの設定 ID3D11ShaderResourceView* pNull[1] = { 0 }; pD3D11DeviceContext->PSSetShaderResources(0, 1, TexPtr->GetShaderResourceView().GetAddressOf()); //ラッピングサンプラー ID3D11SamplerState* pSampler = RenderState->GetLinearWrap(); pD3D11DeviceContext->PSSetSamplers(0, 1, &pSampler); //描画 pD3D11DeviceContext->DrawIndexed(m_SquareMesh->GetNumIndicis(), 0, 0); //後始末 Dev->InitializeStates(); }