4

目前我正在为 Windows Store 开发应用程序,它使用 Direct2D 进行实时图像处理。它必须支持各种尺寸的图像。我遇到的第一个问题是如何处理图像大于支持的最大纹理大小的情况。经过一些研究和文档阅读后,我发现 VirtualSurfaceImageSource 作为解决方案。想法是将图像加载为 IWICBitmap,然后使用 CreateWICBitmapRenderTarget 创建渲染目标(据我所知,它不是硬件加速的)。经过一些绘图操作后,我想通过使 VirtualSurfaceImage 源中的相应区域无效或在 NeedUpdate 回调触发时将结果显示到屏幕上。我认为可以通过创建 ID2D1Bitmap(硬件加速)并使用使用 CreateWICBitmapRenderTarget 创建的渲染目标和无效区域作为边界来调用 CopyFromRenderTarget,但该方法会返回 D2DERR_WRONG_RESOURCE_DOMAIN 作为结果。使用 IWICBitmap 的另一个原因是应用程序中涉及的算法之一,它必须有权更新图像的像素。

问题是为什么这个逻辑不起作用?这是使用 Direct2D 实现我的目标的正确方法吗?此外,如果我想在 GPU 上使用大于最大允许纹理大小的图像进行图像处理,那么使用 CreateWICBitmapRenderTarget 创建的渲染目标不是硬件加速的,这是最佳解决方案吗?

先感谢您。

4

1 回答 1

3

您是正确的,必须在软件中处理大于纹理限制的图像。

但是,要问的问题是每次渲染时是否需要整个图像。

您可以使用硬件加速来渲染加载到软件目标中的大图像的一部分。

例如,

  • 使用 ID2D1RenderTarget::CreateSharedBitmap 制作可供不同资源使用的位图。
  • 然后创建一个 ID2D1BitmapRenderTarget 并将大位图渲染到其中。(确保执行 BeginDraw、Clear、DrawBitmap、EndDraw)。位图和渲染目标都可以被缓存以供后续调用使用。
  • 然后使用 ID2D1Bitmap::CopyFromRenderTarget 方法从该渲染目标复制到常规 ID2D1Bitmap 中,该部分将适合纹理内存。
  • 最后将其绘制到真正的渲染目标 pRT->DrawBitmap
于 2013-07-04T11:57:40.263 回答