2017-06-12 83 views
0

我想調整D3D11Texture2D的大小來縮小它。例如,我有一個1920x1080的紋理,我想以1280x720爲例進行縮放。 就這樣,你知道我沒有繪圖,我只想得到縮放的字節緩衝區。這裏是我的代碼:調整大小D3D11Texture2D DirectX 11

if (mRealTexture == nullptr) { 
     D3D11_TEXTURE2D_DESC description; 
     texture2D->GetDesc(&description); 
     description.BindFlags = 0; 
     description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 
     description.Usage = D3D11_USAGE_STAGING; 
     description.MiscFlags = 0; 
     hr = mDevice->CreateTexture2D(&description, NULL, &mRealTexture); 
     if (FAILED(hr)) { 
      if (mRealTexture) { 
       mRealTexture->Release(); 
       mRealTexture = nullptr; 
      } 
      return NULL; 
     } 
    } 
    mImmediateContext->CopyResource(mRealTexture, texture2D); 

    if (mScaledTexture == nullptr) { 
     D3D11_TEXTURE2D_DESC description; 
     texture2D->GetDesc(&description); 
     description.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE; 
     description.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; 
     description.Width = 1440; 
     description.Height = 585; 
     description.MipLevels = 4; 
     description.ArraySize = 1; 
     description.SampleDesc.Count = 1; 
     description.SampleDesc.Quality = 0; 
     description.Usage = D3D11_USAGE_DEFAULT; 
     hr = mDevice->CreateTexture2D(&description, NULL, &mScaledTexture); 
     if (FAILED(hr)) { 
      if (mScaledTexture) { 
       mScaledTexture->Release(); 
       mScaledTexture = nullptr; 
      } 
      return NULL; 
     } 
    } //I want to copy the mRealTexture on the mScaledTexture, map the scaledTexture and get the buffer. 

感謝您的幫助

+0

https://stackoverflow.com/a/24070486/8111865可能會幫助您 - 它不是工作代碼,而是關於如何使用Direct2D和DXGI調整資源大小的一般概述。 – ozeanix

+0

太糟糕了沒有示例代碼...我認爲很多人需要這樣做... 對於我來說,理解要採取的步驟太含糊。 (我的意思是代碼) – DevAndroid

+0

我知道這聽起來很古怪,我並不是這個意思,但是試着爲概述編寫逼真的僞代碼,併爲每個接口使用MSDN文檔,以便慢慢將它變成真正的實現。首先處理小部件並觀察您的HRESULT。我發現使用DirectX和DirectShow和Media Foundation等類似結構化的東西可能會非常令人沮喪,但它只是花費時間和精力去投資才能真正學習它。一旦你這樣做了,像這樣的問題的解決方案將會非常自然,因爲你對DirectX可以做什麼以及如何去做有着豐富的知識。 – ozeanix

回答

0

已經想到這一點,你是隻剩下幾個選項。

1 - 您創建一個視口等,並使用全屏四元組呈現到您的目標大小。我得到了你不想做的感覺。

2 - 當您將數據從一個緩衝區複製到另一個緩衝區時,您可以滾動自己的縮放比例,這並不算太差,並且可以縮放紋理。

選項2並不算太差,最粗糙的縮放會根據縮放比率讀取一個點,但更準確的版本將是基於加權網格對多個樣本進行平均(需要重新計算權重對於您在目標上訪問的每個像素。)

+0

選項2可以用GDI +完成嗎?我可以將像素緩衝區加載到位圖上,然後對其進行縮放? – DevAndroid

+0

我同意,如果這更關於縮放數據,那麼你可能會更好地避免DX。 – ErnieDingo