复制颜色和深度模板缓冲区供以后使用

时间:2016-06-13 09:37:33

标签: c++ directx-11

我是directX的新手,我的任务是将当前的depthstencil和颜色缓冲区复制到纹理中。之后,这些纹理将被复制到color / depthstencil缓冲区中以在旧场景上渲染,而不会渲染两次孔场景。

此代码生成rendertarget:

bool CGraphicsDriverDX11::CreateRenderTargetTexture(UINT nWidth, UINT nHeight, DXGI_FORMAT Format,
                                                ID3D11Texture2D** ppRenderTargetTexture, ID3D11RenderTargetView** ppRenderTargetView,
                                                    ID3D11ShaderResourceView** ppRenderTargetSRV, bool bMultiSample)
{
    D3D11_TEXTURE2D_DESC TextureDesc;
    ZeroMemory(&TextureDesc, sizeof(TextureDesc));
    TextureDesc.Width = nWidth;
    TextureDesc.Height = nHeight;
    TextureDesc.MipLevels = 1;
    TextureDesc.ArraySize = 1;
    TextureDesc.Format = Format;

    if (bMultiSample)
    {
        TextureDesc.SampleDesc.Count = m_nMultiSampleCount;
        TextureDesc.SampleDesc.Quality = m_nMultiSampleQuality;
    }
    else
    {
        TextureDesc.SampleDesc.Count = 1;
        TextureDesc.SampleDesc.Quality = 0;
    }

    TextureDesc.Usage = D3D11_USAGE_DEFAULT;
    TextureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
    TextureDesc.CPUAccessFlags = 0;
    TextureDesc.MiscFlags = 0;

    HRESULT hr = m_pD3D11Device->CreateTexture2D(&TextureDesc, nullptr, ppRenderTargetTexture);

    if (FAILED(hr))
    {
        DebugAssertOnce(UNABLE_TO_CREATE_RENDER_TARGET_TEXTURE);
        return false;
    }

    hr = m_pD3D11Device->CreateRenderTargetView(*ppRenderTargetTexture, nullptr, ppRenderTargetView);

    if (FAILED(hr))
    {
        DebugAssertOnce(UNABLE_TO_CREATE_RENDER_TARGET_VIEW);
        return false;
    }

    if (ppRenderTargetSRV)
    {
        D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;
        ZeroMemory(&SRVDesc, sizeof(SRVDesc));

        SRVDesc.Format = TextureDesc.Format;
        SRVDesc.Texture2D.MipLevels = TextureDesc.MipLevels;
        SRVDesc.Texture2D.MostDetailedMip = 0;
        SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;

        hr = m_pD3D11Device->CreateShaderResourceView(*ppRenderTargetTexture, &SRVDesc, ppRenderTargetSRV);

        if (FAILED(hr))
        {
            DebugAssertOnce(UNABLE_TO_CREATE_SHADER_RESOURCE_VIEW);
            return false;
        }
    }

    return true;
}

此代码生成深度缓冲区

bool CGraphicsDriverDX11::CreateDepthTexture(UINT nWidth, UINT nHeight, DXGI_FORMAT Format,
                                             ID3D11Texture2D** ppDepthStencilTexture, ID3D11DepthStencilView** ppDepthStencilView,
                                             ID3D11ShaderResourceView** ppDepthStencilSRV, bool bMultiSample)
{
    D3D11_TEXTURE2D_DESC TextureDesc;
    ZeroMemory(&TextureDesc, sizeof(TextureDesc));
    TextureDesc.Width = nWidth;
    TextureDesc.Height = nHeight;
    TextureDesc.MipLevels = 1;
    TextureDesc.ArraySize = 1;
    TextureDesc.Format = Format;

    if (bMultiSample)
    {
        TextureDesc.SampleDesc.Count = m_nMultiSampleCount;
        TextureDesc.SampleDesc.Quality = m_nMultiSampleQuality;
    }
    else
    {
        TextureDesc.SampleDesc.Count = 1;
        TextureDesc.SampleDesc.Quality = 0;
    }

    TextureDesc.Usage = D3D11_USAGE_DEFAULT;
    TextureDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
    TextureDesc.CPUAccessFlags = 0;
    TextureDesc.MiscFlags = 0;

    HRESULT hr = m_pD3D11Device->CreateTexture2D(&TextureDesc, nullptr, ppDepthStencilTexture);

    if (FAILED(hr))
    {
        DebugAssertOnce(UNABLE_TO_CREATE_DEPTHBUFFER_TEXTURE);
        return false;
    }

    m_pD3D11Device->CreateDepthStencilView(*ppDepthStencilTexture, nullptr, ppDepthStencilView);

    if (FAILED(hr))
    {
        DebugAssertOnce(UNABLE_TO_CREATE_DEPTHBUFFER_VIEW);
        return false;
    }

    if (ppDepthStencilSRV)
    {
        D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc;
        ZeroMemory(&SRVDesc, sizeof(SRVDesc));

        SRVDesc.Format = TextureDesc.Format;
        SRVDesc.Texture2D.MipLevels = TextureDesc.MipLevels;
        SRVDesc.Texture2D.MostDetailedMip = 0;
        SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;

        hr = m_pD3D11Device->CreateShaderResourceView(*ppDepthStencilTexture, &SRVDesc, ppDepthStencilSRV);

        if (FAILED(hr))
        {
            DebugAssertOnce(UNABLE_TO_CREATE_SHADER_RESOURCE_VIEW);
            return false;
        }
    }
    return true;
}

现在我尝试复制它:

ResolveSubresource(GetZBufferCopyTexture(), 0, GetDepthStencilBufferTexture(), 0, DXGI_FORMAT_D24_UNORM_S8_UINT);
ResolveSubresource(GetColorCopyTexture(), 0, GetBackBuffer(), 0, DXGI_FORMAT_R8G8B8A8_UNORM);

并尝试将副本复制回rendertarget / depthstencil

ResolveSubresource(GetDepthStencilBufferTexture(), 0, GetZBufferCopyTexture(), 0, DXGI_FORMAT_D24_UNORM_S8_UINT);
ResolveSubresource(GetBackBuffer(), 0, GetColorCopyTexture(), 0, DXGI_FORMAT_R8G8B8A8_UNORM);

但这不能正常工作。我看不到变化。也许我理解directx11的工作原理是完全错误的。 我用OpenGL做到了这一点,我只需要使用blitframebuffer命令复制FramebufferObject,它运行得非常好。这是同一个项目,所以我确信我按正确的顺序调用这些命令。但是directx11对我来说是全新的

编辑: 我还将命令“ResolveSubresource”更改为“CopyResource”,但也没有更改

1 个答案:

答案 0 :(得分:3)

我发现了错误: 我使用了错误的纹理...... 现在它工作得很好,BTW我使用“CopyResource”命令,因为“ResolveSubresource”只将多重采样资源复制到非多重采样资源