我構建了一個非常簡單的程式,它只是清除渲染目標。最終,當我呼叫 ID3D11DeviceContext::OMSetRenderTargets() 時,ID3D11RenderTargetView 被洗掉,我不明白為什么。我的想法是在創建 IDXGISwapChain1 的某個地方,我指定了一些錯誤。
一次:
UINT deviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
#ifdef _DEBUG
deviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif
GFX_THROW_IF_FAILED(D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
deviceFlags,
nullptr,
0u,
D3D11_SDK_VERSION,
&m_pDevice,
&m_featureLevel,
&m_pContext
));
if (m_featureLevel < D3D_FEATURE_LEVEL_11_0)
throw ExceptionMessage(__FILE__, __LINE__, "Graphics device does not support feature level 11.");
Microsoft::WRL::ComPtr<IDXGIFactory2> pFactory = {};
GFX_THROW_IF_FAILED(CreateDXGIFactory(IID_PPV_ARGS(&pFactory)));
DXGI_SWAP_CHAIN_DESC1 scDesc = {};
scDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
scDesc.SampleDesc.Count = 1u;
scDesc.SampleDesc.Quality = 0u;
scDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
scDesc.BufferCount = sc_uBufferCount;
scDesc.Scaling = DXGI_SCALING_NONE;
scDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;
scDesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
scDesc.Flags = 0u;
GFX_THROW_IF_FAILED(pFactory->CreateSwapChainForHwnd(
m_pDevice.Get(),
t_hWnd,
&scDesc,
nullptr,
nullptr,
&m_pSwapChain
));
m_uWindowWidth = scDesc.Width;
m_uWindowHeight = scDesc.Height;
Microsoft::WRL::ComPtr<ID3D11Resource> pBackBuffer = {};
GFX_THROW_IF_FAILED(m_pSwapChain->GetBuffer(0u, IID_PPV_ARGS(&pBackBuffer)));
GFX_THROW_IF_FAILED(m_pDevice->CreateRenderTargetView(pBackBuffer.Get(), nullptr, &m_pTarget));
和更新方法:
float color[] = { (252.0f / 255.0f), (186.0f / 255.0f), (3.0f / 255.0f), 1.0f };
m_pContext->ClearRenderTargetView(m_pTarget.Get(), color);
m_pContext->OMSetRenderTargets(1u, &m_pTarget, nullptr);
if (m_pTarget.Get() == nullptr)
throw ExceptionMessage(__FILE__, __LINE__, "m_pTarget has been set to null");
GFX_THROW_IF_FAILED(m_pSwapChain->Present(1u, 0u));
uj5u.com熱心網友回復:
我假設您正在Microsoft::WRL::ComPtr使用m_pTarget. 因此,當呼叫多載時,m_pContext->OMSetRenderTargets(1u, &m_pTarget, nullptr);而不是僅僅將指標的地址作為指向包含單個指標的陣列的第一個元素的指標傳遞。多載旨在將指向指標值的指標傳遞給某些初始化函式時使用,因此它釋放存盤指標的所有權,因此您得到空值。operator &operator &
你應該使用GetAddressOf方法
m_pContext->OMSetRenderTargets(1u, m_pTarget.GetAddressOf(), nullptr);
或創建一個臨時陣列:
::std::array<::ID3D11RenderTargetView *> views{m_pTarget.Get()};
m_pContext->OMSetRenderTargets(views.size(), views.data(), nullptr);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/512400.html
標籤:C 直接
