void FlatDX::PopulateCommandList(const size_t i) { const auto CL = GraphicsCommandLists[i].Get(); const auto SCR = SwapChainResources[i].Get(); const auto SCHandle = GetCPUDescriptorHandle(SwapChainDescriptorHeap.Get(), D3D12_DESCRIPTOR_HEAP_TYPE_RTV, static_cast<UINT>(i)); const auto CA = CommandAllocators[0].Get(); VERIFY_SUCCEEDED(CL->Reset(CA, PipelineState.Get())); { CL->RSSetViewports(static_cast<UINT>(Viewports.size()), Viewports.data()); CL->RSSetScissorRects(static_cast<UINT>(ScissorRects.size()), ScissorRects.data()); ResourceBarrier(CL, SCR, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); { ClearColor(CL, SCHandle, DirectX::Colors::SkyBlue); { const std::vector<D3D12_CPU_DESCRIPTOR_HANDLE> RTDescriptorHandles = { SCHandle }; CL->OMSetRenderTargets(static_cast<UINT>(RTDescriptorHandles.size()), RTDescriptorHandles.data(), FALSE, nullptr); } CL->SetGraphicsRootSignature(RootSignature.Get()); CL->IASetPrimitiveTopology(GetPrimitiveTopology()); CL->ExecuteIndirect(IndirectCommandSignature.Get(), 1, IndirectBufferResource.Get(), 0, nullptr, 0); } ResourceBarrier(CL, SCR, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT); } VERIFY_SUCCEEDED(CL->Close()); }
//レンダリングターゲットを開始する 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 RenderWindowD11_2::BeginRender() { auto context = m_pRSystem->GetD3DDeviceContext(); context->RSSetViewports(1, &m_screenViewport); ID3D11RenderTargetView *const targets[1] = { m_d3dRenderTargetView.Get() }; context->OMSetRenderTargets(1, targets, m_d3dDepthStencilView.Get()); context->ClearRenderTargetView(m_d3dRenderTargetView.Get(), DirectX::Colors::CornflowerBlue); // TODO SET COLOR context->ClearDepthStencilView(m_d3dDepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); }
void Camera::SetViewport() const { auto context = GraphicsDevice::GetInstance()->GetDeviceContext(); int width = Screen::GetWidth(); int height = Screen::GetHeight(); D3D11_VIEWPORT vp; vp.Width = m_rect.width * width; vp.Height = m_rect.height * height; vp.MinDepth = 0.0f; vp.MaxDepth = 1.0f; vp.TopLeftX = m_rect.left * width; vp.TopLeftY = m_rect.top * height; context->RSSetViewports(1, &vp); }
//レンダリングターゲットを終了する 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); }
// Helper method to clear the back buffers. void Application::Clear() { m_deviceResources->PIXBeginEvent(L"Clear"); // Clear the views. auto context = m_deviceResources->GetD3DDeviceContext(); auto renderTarget = m_deviceResources->GetRenderTargetView(); auto depthStencil = m_deviceResources->GetDepthStencilView(); float color[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; context->ClearRenderTargetView(renderTarget, color); context->ClearDepthStencilView(depthStencil, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0); context->OMSetRenderTargets(1, &renderTarget, depthStencil); // Set the viewport. auto viewport = m_deviceResources->GetScreenViewport(); context->RSSetViewports(1, &viewport); m_deviceResources->PIXEndEvent(); }
//操作 //スクリーン全体を指定の色でクリアする 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); }
// TODO create software window bool RenderWindowD11_2::Create(const _lParametor& config) { _lParametor::const_iterator parametor; HRESULT hr = S_FALSE; auto divace = m_pRSystem->GetD3DDevice(); auto context = m_pRSystem->GetD3DDeviceContext(); // Î÷èñòèòü ïðåäûäóùàÿ ðàçìåð îêíà êîíêðåòíîãî êîíòåêñòà. ID3D11RenderTargetView* nullViews[] = { nullptr }; context->OMSetRenderTargets(ARRAYSIZE(nullViews), nullViews, nullptr); m_d3dRenderTargetView = nullptr; m_d3dDepthStencilView = nullptr; context->Flush(); parametor = config.find("window_name"); if (parametor != config.end()) { mObjectName = parametor->second; } _32un bit = 0; parametor = config.find("display_mode"); if (parametor != config.end()) { StringConverter::ParseDisplyaMode(parametor->second, m_nWidth, m_nHeight, bit); } else { DrawLine("~RenderWindowD11_2: not set display_mode", MT_ERROR); return false; } parametor = config.find("full_screan_mode"); if (parametor != config.end()) { m_bFullScrean = StringConverter::Parse_bool(parametor->second); } else { DrawLine("~RenderWindowD11_2: not set full_screan_mode set in false"); m_bFullScrean = false; } parametor = config.find("window_handle"); if (parametor != config.end()) { m_hWnd = StringConverter::Parse_int(parametor->second); } else { DrawLine("~RenderWindowD11_2: not set window_handle", MT_ERROR); return false; } DXGI_SWAP_CHAIN_DESC1 swapChainDesc = { 0 }; swapChainDesc.Width = m_nWidth; swapChainDesc.Height = m_nHeight; swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; // Ýòî íàèáîëåå ðàñïðîñòðàíåííûé ôîðìàò swap chain. swapChainDesc.Stereo = false; swapChainDesc.SampleDesc.Count = 1; // Don't use multi-sampling. swapChainDesc.SampleDesc.Quality = 0; swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; swapChainDesc.BufferCount = 2; // Use double-buffering to minimize latency. swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL; // All Windows Store apps must use this SwapEffect. swapChainDesc.Flags = 0; swapChainDesc.Scaling = DXGI_SCALING_NONE; swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE; ComPtr<IDXGIDevice2> dxgiDevice; divace->QueryInterface(IID_PPV_ARGS(&dxgiDevice)); ComPtr<IDXGIAdapter> dxgiAdapter; dxgiDevice->GetAdapter(&dxgiAdapter); ComPtr<IDXGIFactory2> dxgiFactory; dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)); hr = dxgiFactory->CreateSwapChainForHwnd( divace, // pDevice [in] (HWND)m_hWnd, // hWnd [in] &swapChainDesc, // pDesc [in] nullptr, // pFullscreenDesc [in, optional] nullptr, // pRestrictToOutput [in, optional] &m_swapChain // ppSwapChain [out] ); if (FAILED(hr)) { DrawLine("~RenderWindowD11_2: " + RenderSystemD11_2::GetErrorHR(hr), MT_ERROR); return false; } // Óáåäèòåñü, ÷òî DXGI íå ñòîÿòü â î÷åðåäè áîëüøå, ÷åì îäèí êàäð çà îäèí ðàç. Ýòî è ñîêðàùàåò çàäåðæêè è // Ãàðàíòèðóåò, ÷òî ïðèëîæåíèå áóäåò îêàçûâàòü òîëüêî ïîñëå êàæäîãî VSync, ìèíèìèçèðóÿ ïîòðåáëåíèå ýíåðãèè. dxgiDevice->SetMaximumFrameLatency(1); // Create a render target view of the swap chain back buffer. ComPtr<ID3D11Texture2D> backBuffer; m_swapChain->GetBuffer(0, IID_PPV_ARGS(&backBuffer)); divace->CreateRenderTargetView( backBuffer.Get(), nullptr, &m_d3dRenderTargetView ); // Create a depth stencil view for use with 3D rendering if needed. CD3D11_TEXTURE2D_DESC depthStencilDesc( DXGI_FORMAT_D24_UNORM_S8_UINT, m_nWidth, m_nHeight, 1, // This depth stencil view has only one texture. 1, // Use a single mipmap level. D3D11_BIND_DEPTH_STENCIL ); ComPtr<ID3D11Texture2D> depthStencil; divace->CreateTexture2D( &depthStencilDesc, nullptr, &depthStencil ); CD3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc(D3D11_DSV_DIMENSION_TEXTURE2D); divace->CreateDepthStencilView( depthStencil.Get(), &depthStencilViewDesc, &m_d3dDepthStencilView ); // Set the 3D rendering viewport to target the entire window. m_screenViewport = CD3D11_VIEWPORT( 0.0f, 0.0f, (FLOAT)m_nWidth, (FLOAT)m_nHeight ); context->RSSetViewports(1, &m_screenViewport); m_bInit = true; return true; }