2016-06-13 61 views
0

我是directX的新手,我的任務是將當前depthstencil和顏色緩衝區複製到紋理中。稍後,這些紋理將被複制到顏色/深度網格緩衝區中,以便在舊場景上渲染而不渲染洞場景兩次。複製顏色和depthstencil緩衝區供以後使用

此代碼生成的渲染目標:

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); 

,也嘗試複製回/複製到渲染目標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」也沒什麼改變

回答

3

我發現了錯誤: 我用錯質地... 現在它工作得很好,順便說一句,我使用「CopyResource」命令,因爲「ResolveSubresource」僅將多采樣資源複製到非多采樣資源中