对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

 

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