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