2016-06-13 4 views
0

私はdirectXを初めて使いました。私の仕事は、現在のdepthstencilとカラーバッファをテクスチャにコピーすることです。後で、このテクスチャは、穴のシーンを2回レンダリングせずに、古いシーンでレンダリングするために、カラー/深さステンシルバッファにコピーされます。後で使用するためのコピーカラーと奥行きステンシルバッファ

このコードは、レンダーターゲットを生成します。

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

もが

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

depthstencil /レンダーターゲットに戻ってコピーをコピーしようとするが、これは正しく動作しません。私は何の変化も見ない。多分directx11の仕組みが完全に間違っていることを理解しているかもしれません。 私はOpenGLでこれを行いました。そこでは、blitframebufferコマンドでFramebufferObjectをコピーするだけでしたが、うまくいきました。それは同じプロジェクトだったので、これらのコマンドを正しい順序で呼び出すことができます。しかしdirectx11が完全に新しいものに私に

EDIT: 私はまた、「COPYRESOURCE」にコマンド「ResolveSubresource」に変更だけでなく、何の変化

答えて

3

私は間違いを発見した: 私は間違ったテクスチャを使用... 今"ResolveSubresource"はマルチサンプルされたリソースだけをマルチサンプルされていないリソースにコピーするため、 "CopyResource"コマンドを使用します。

関連する問題