最近需要对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