對ID3D11Texture2D實現顏色填充(對D3D11實現IDirect3DDevice9::ColorFill效果)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章