2

目前,我正在開發使用Direct2D進行實時圖像處理的Windows應用商店的應用程序。它必須支持各種尺寸的圖像。我遇到的第一個問題是如何處理圖像大於最大支持紋理大小的情況。經過一些研究和文檔閱讀後,我發現VirtualSurfaceImageSource是一個解決方案。這個想法是加載圖像作爲IWICBitmap,然後用CreateWICBitmapRenderTarget(據我所知不是硬件加速)創建渲染目標。經過一些繪圖操作之後,我想通過使VirtualSurfaceImage源中相應的區域無效或在NeedUpdate回調觸發時將結果顯示在屏幕上。我認爲可以通過創建ID2D1Bitmap(硬件加速)並使用CreateWICBitmapRenderTarget創建的渲染目標和無效區域作爲邊界調用CopyFromRenderTarget來實現,但該方法因此返回D2DERR_WRONG_RESOURCE_DOMAIN。使用IWICBitmap的另一個原因是應用程序中涉及的算法之一,它必須有權訪問更新圖像的像素。使用Direct2D進行實時圖像處理的大型圖像

問題是爲什麼這個邏輯不起作用?這是使用Direct2D實現我的目標的正確方法嗎?另外就用CreateWICBitmapRenderTarget創建的渲染目標不是硬件加速,如果我想在GPU上執行我的圖像處理,並且圖像大於最大允許紋理大小,這是最佳解決方案?

預先感謝您。

回答

2

你是正確的,圖像大於紋理限制必須在軟件中處理。

但是,要問的問題是每次渲染時是否需要整個圖像。

您可以使用硬件加速器渲染加載到軟件目標中的大圖像的一部分。

例如,

  • 使用ID2D1RenderTarget :: CreateSharedBitmap使可以通過不同的資源使用的位圖。
  • 然後創建一個ID2D1BitmapRenderTarget並將大的位圖渲染到該位圖中。 (確保執行BeginDraw,Clear,DrawBitmap,EndDraw)。位圖和渲染目標都可以被緩存以供連續調用使用。
  • 然後使用ID2D1Bitmap :: CopyFromRenderTarget方法將該渲染目標複製到常規ID2D1Bitmap中,該部分將適合紋理內存。
  • 最後將其繪製到真實渲染目標上,pRT-> DrawBitmap