2016-10-25 27 views
0

texture3Dスライスを2次元画像で塗りつぶします。texture3dスライスを塗りつぶし

3D cube with the texture3D texture

間違っUVWのようなレンダリングの問題は、私はまた、あなたの写真を与える座標されていないことを確認するために:あなたはこの絵で見ることができるように 私の結果はわずか6枚の画像の最初の私をバック与えますUVW座標:ここ

uvw coordinates of the 3d cube

はtexture3dの創造のコードです:

if (ETextureType::Texture3D == TextureType) 
{ 
    ID3D11Texture3D* pTexture3D = nullptr; 
    D3D11_TEXTURE3D_DESC TextureDesc; 
    ZeroMemory(&TextureDesc, sizeof(TextureDesc)); 
    TextureDesc.Width = nWidth; 
    TextureDesc.Height = nHeight; 
    TextureDesc.MipLevels = nMipMaps; 
    TextureDesc.Depth = nDepth; 
    TextureDesc.Usage = D3D11_USAGE_DEFAULT; 
    TextureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE; 

    switch (TextureFormat) 
    { 
     case ETextureFormat::R8G8B8A8: 
     { 
      TextureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
     } 
     break; 

     case ETextureFormat::R32FG32FB32FA32F: 
     { 
      TextureDesc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT; 
     } 
     break; 

     default: 
     DebugAssertOnce(UNKNOWN_TEXTURE_FORMAT); 
    } 

    HRESULT hr = m_pD3D11Device->CreateTexture3D(&TextureDesc, nullptr, &pTexture3D); 

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

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

     SRVDesc.Format = TextureDesc.Format; 
     SRVDesc.Texture3D.MipLevels = TextureDesc.MipLevels; 
     SRVDesc.Texture3D.MostDetailedMip = 0; 
     SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; 
     hr = m_pD3D11Device->CreateShaderResourceView(pTexture3D, &SRVDesc, &pShaderResourceView); 

     if (FAILED(hr)) 
     { 
      pTexture3D->Release(); 

      DebugAssertOnce(UNABLE_TO_CREATE_SHADER_RESOURCE_VIEW); 
      return false; 
     } 
    } 

    else if (bCreateRenderTargetView) 
    { 
     ID3D11RenderTargetView* pRenderTargetView = nullptr; 

     hr = m_pD3D11Device->CreateRenderTargetView(pTexture3D, nullptr, &pRenderTargetView); 

     if (FAILED(hr)) 
     { 
      pShaderResourceView->Release(); 
      pTexture3D->Release(); 

      DebugAssertOnce(UNABLE_TO_CREATE_RENDERTARGET_VIEW); 
      return false; 
     } 

     pView = pRenderTargetView; 
    } 
    *ppTexture = new CTextureDX11(TextureType, pTexture3D, pShaderResourceView, pView); 
    return true; 
} 

とも充填一部:

bool CGraphicsDriverDX11::CreateTexture3DFromImageBuffers(CTexture** ppTexture, const std::vector<CImageBuffer*>* pvecImageBuffers) 
{ 
    uint32_t nWidth = pvecImageBuffers->front()->GetWidth(); 
    uint32_t nHeight = pvecImageBuffers->front()->GetHeight(); 

    uint32_t nMipMapLevels = 1; 

    bool bRet = CreateTexture(ppTexture, nWidth, nHeight, ETextureType::Texture3D, ETextureFormat::R8G8B8A8, nMipMapLevels, false, true, false, static_cast<UINT>(pvecImageBuffers->size())); 

    if (bRet) 
    { 
     ID3D11Texture3D* pD3DTexture = static_cast<ID3D11Texture3D*>((*ppTexture)->GetTexture()); 

     for (size_t nImageBuffer = 0; nImageBuffer < pvecImageBuffers->size(); ++nImageBuffer) 
     { 
      uint32_t nIndex = D3D11CalcSubresource(static_cast<UINT>(nImageBuffer), 0, 1); 

      m_pD3D11DeviceContext->UpdateSubresource(pD3DTexture, nIndex, nullptr, pvecImageBuffers->at(nImageBuffer)->GetData(), nWidth * 4, 0); 

     } 
    } 

    return bRet; 
} 

私は例えば、私がtexture2DArrayにこのコードを変更し、それがうまく働いた...多くのことを試してみました。間違いは私のCImageBufferクラスではありません。 nDepth変数も正しい値を持っています...私はのUpdateSubresourceのために別のコマンドを使用する必要があると思います。 私はインターネットでいくつかの例を見つけられませんでした。 ありがとうございます

答えて

2

スライス内のすべての深度テクスチャは、1つのサブリソースに並べてあります。また、与えられたミップレベルのスライスにいくつの奥行き画像が存在するかを計算する必要があります。

これはあなたの全体のスライスが含まれているサブリソースインデックスを与える:

これは、与えられたミップレベルのためのスライスにあなたのイメージの数を示します
D3D11CalcSubresource(level, 0, mipLevels); 

std::max(depth >> level, 1); 

各画像スライスでサブリソース内にD3D11_MAPPED_SUBRESOURCE.RowPitchのピッチが1つずつ配置されており、スライスの合計サイズはD3D11_MAPPED_SUBRESOURCE.DepthPitchです。

たとえば、ここにはDirectXTexのコードがあります。キャプチャされた3Dボリュームテクスチャからデータを読み込んでいますが、テクスチャを塗りつぶすときのロジックは同じです。

if (metadata.IsVolumemap()) 
    { 
     assert(metadata.arraySize == 1); 

     size_t height = metadata.height; 
     size_t depth = metadata.depth; 

     for (size_t level = 0; level < metadata.mipLevels; ++level) 
     { 
      UINT dindex = D3D11CalcSubresource(level, 0, metadata.mipLevels); 

      D3D11_MAPPED_SUBRESOURCE mapped; 
      HRESULT hr = pContext->Map(pSource, dindex, D3D11_MAP_READ, 0, &mapped); 
      if (FAILED(hr)) 
       // error 

      auto pslice = reinterpret_cast<const uint8_t*>(mapped.pData); 

      size_t lines = ComputeScanlines(metadata.format, height); 
      // For uncompressed images, lines == height 

      for (size_t slice = 0; slice < depth; ++slice) 
      { 
       const Image* img = result.GetImage(level, 0, slice); 

       const uint8_t* sptr = pslice; 
       uint8_t* dptr = img->pixels; 
       for (size_t h = 0; h < lines; ++h) 
       { 
        size_t msize = std::min<size_t>(img->rowPitch, mapped.RowPitch); 
        memcpy_s(dptr, img->rowPitch, sptr, msize); 
        sptr += mapped.RowPitch; 
        dptr += img->rowPitch; 
       } 

       pslice += mapped.DepthPitch; 
      } 

      pContext->Unmap(pSource, dindex); 

      if (height > 1) 
       height >>= 1; 
      if (depth > 1) 
       depth >>= 1; 
     } 
    } 
+0

ありがとう!それはそのように働いています! – Thomas