【问题标题】:Large images with Direct2D使用 Direct2D 的大图像
【发布时间】:2013-04-26 14:36:24
【问题描述】:

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

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

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    例如,

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

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2021-03-17
      • 2017-09-24
      • 2012-06-01
      • 2012-02-19
      • 2013-11-01
      • 1970-01-01
      • 2013-04-26
      • 2011-12-07
      相关资源
      最近更新 更多