Direct2D的大图像

时间:2013-05-02 12:13:21

标签: image-processing graphics windows-8 windows-store-apps direct2d

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

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

提前谢谢。

1 个答案:

答案 0 :(得分:3)

你是正确的,大于纹理限制的图像必须用软件处理。

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

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

例如,

  • 使用ID2D1RenderTarget :: CreateSharedBitmap制作可供不同资源使用的位图。
  • 然后创建一个ID2D1BitmapRenderTarget并将大位图呈现为该位图。 (确保执行BeginDraw,Clear,DrawBitmap,EndDraw)。可以缓存位图和渲染目标,以供连续调用使用。
  • 然后使用ID2D1Bitmap :: CopyFromRenderTarget方法将该渲染目标复制到常规ID2D1Bitmap中,该部分将适合纹理内存。
  • 最后将其绘制到真实渲染目标,pRT-> DrawBitmap