最近需要對ID3D11Texture2D的內容進行的清空操作,網上找了一大堆都比較複雜,於是自己寫了個通過RenderTargetView來實現簡單的清空操作,在這裏做個記錄 方便自己也方便大家。
BOOL CD3DObject::CreateD3d() //此處創建測試資源 Device和Texture
{
UINT uCreateDeviceFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;
D3D_FEATURE_LEVEL flvl[] = { D3D_FEATURE_LEVEL_11_1,D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_10_0 };
HRESULT hr = D3D11CreateDevice(
NULL,
D3D_DRIVER_TYPE_HARDWARE,
NULL,
uCreateDeviceFlags,
flvl,
sizeof(flvl) / sizeof(D3D_FEATURE_LEVEL),
D3D11_SDK_VERSION,
&m_pD3DDevice,
NULL,
&m_pContext
);
if (FAILED(hr))
{
OutputDebugStringA("D3D11CreateDevice Failed !\n");
return FALSE;
}
D3D11_TEXTURE2D_DESC desc;
desc.Width = 1920;
desc.Height = 1080;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;//DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = 40;
desc.CPUAccessFlags = 0;
desc.MiscFlags = D3D11_RESOURCE_MISC_SHARED;
hr = m_pD3DDevice->CreateTexture2D(&desc, NULL, &m_pTexture);
if (FAILED(hr))
{
OutputDebugStringA("CreateTexture2D Failed !\n");
return FALSE;
}
return TRUE;
}
BOOL CD3DObject::ColorFill() //進行顏色填充操作
{
/*
//流程:
1、先保存當前設備的RenderTargetView和D3D11_VIEWPORT
2、拿到需要清空的Texture的RenderTargetView
3、清空RenderTargetView
4、還原之前的資源
*/
ID3D11RenderTargetView* pOldRenderTargetView = NULL;
ID3D11DepthStencilView* pDepthStencilView = NULL;
D3D11_VIEWPORT OldViewPort;
ID3D11RenderTargetView* pNowRenderTargetTexture = NULL;
HRESULT hr = S_OK;
//保存之前的設置,以免對同一device下的其他資源產生影響
m_pContext->OMGetRenderTargets(1, &pOldRenderTargetView, &pDepthStencilView);
UINT numViewports = 1;
m_pContext->RSGetViewports(&numViewports, &OldViewPort);
//設置當前Texture的RenderTargetTexture
hr = m_pD3DDevice->CreateRenderTargetView(m_pTexture, nullptr, &pNowRenderTargetTexture);
if (FAILED(hr))
{
OutputDebugStringA("CreateRenderTargetView failed !\n");
return FALSE;
}
m_pContext->OMSetRenderTargets(1, &pNowRenderTargetTexture, nullptr);
//設置當前Texture的VIEWPORT
D3D11_TEXTURE2D_DESC _desc;
m_pTexture->GetDesc(&_desc);
D3D11_VIEWPORT VP;
VP.Width = static_cast<FLOAT>(_desc.Width);
VP.Height = static_cast<FLOAT>(_desc.Height);
VP.MinDepth = 0.0f;
VP.MaxDepth = 1.0f;
VP.TopLeftX = 0;
VP.TopLeftY = 0;
m_pContext->RSSetViewports(1, &VP);
//清空資源
float UserColor[4] = { 1.0f, 1.0f, 1.0f, 1.0f };//顏色格式爲RBGA//白色
m_pContext->ClearRenderTargetView(pNowRenderTargetTexture, UserColor);
//把老資源設回去
m_pContext->OMSetRenderTargets(1, &pOldRenderTargetView, pDepthStencilView);
m_pContext->RSSetViewports(1, &OldViewPort);
if (pNowRenderTargetTexture != NULL)
{
pNowRenderTargetTexture->Release();
pNowRenderTargetTexture = NULL;
}
return TRUE;
}
源碼地址:https://download.csdn.net/download/qq_33650889/12534823