大图像与Direct2D

4
目前我正在开发一个Windows Store应用程序,使用Direct2D进行实时图像处理。它必须支持各种大小的图像。我面临的第一个问题是如何处理当图像大于最大支持的纹理大小时的情况。经过一些研究和文档阅读,我发现VirtualSurfaceImageSource是一种解决方案。我的想法是将图像加载为IWICBitmap,然后使用CreateWICBitmapRenderTarget创建渲染目标(据我所知这不是硬件加速的)。在一些绘制操作之后,我想通过使对应的区域无效来将结果显示到屏幕上,或者在NeedUpdate回调触发时。我认为可以通过创建ID2D1Bitmap(硬件加速)并使用CreateWICBitmapRenderTarget创建的渲染目标以及作为边界的无效区域来调用CopyFromRenderTarget来实现,但该方法返回D2DERR_WRONG_RESOURCE_DOMAIN。使用IWICBitmap的另一个原因是应用程序中涉及到的算法之一必须访问更新图像的像素。
问题是为什么这种逻辑行不通?这是使用Direct2D实现我的目标的正确方法吗?此外,如果我要使用大于允许的最大纹理大小的图像在GPU上进行图像处理,那么使用CreateWICBitmapRenderTarget创建的渲染目标不是硬件加速的,哪种方法最好?
提前感谢您。
1个回答

3

你说得对,大于纹理限制的图像必须在软件中处理。

然而,需要问的问题是每次渲染是否都需要整个图像。

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

例如,

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接