【问题标题】:Create multi-layer rendering using DirectX (2D)使用 DirectX (2D) 创建多层渲染
【发布时间】:2012-03-12 09:44:12
【问题描述】:

我是 DirectX 的新手,所以我对这项技术知之甚少。 我想重现 Photoshop 所做的相同渲染。我的意思是能够实时渲染多个图层(每个图层都有 alpha 贴图)。 有人告诉我 Photoshop 使用 DirectX/OpenGl。对于我的项目,我可以使用 DirectX。

我找到了这篇文章Direct3D rendering 2D images with "multiply" blending mode and alpha,它准确地解释了我想要做什么,但是这篇文章已经很老了,而且他使用了 D3D9。也许,现在有一种更简单/更快的方法可以使用 DirectX 11 和 Direct2D 创建相同的效果。

希望您在我开始任何事情之前给我一些建议。

谢谢。

编辑:我不知道我是否足够清楚,我不是要任何代码,只是为了一个方向:如果我应该使用 Direct2D 或 Direct3D 9/10/11。如果我必须对着色器进行编程......那么做这个项目最好的方法是什么?

【问题讨论】:

  • 您是否应该使用硬件混合或着色器的多次绘制取决于您希望处理多少层,以及对此的要求。如果每一层对所有先前的结果进行加法/乘法/等操作是可以接受的,那么只需做一个非常基本的SetTexture, Draw(quad) 循环;如果您需要更复杂的混合,则需要为所有可能的混合模式设置一组着色器,每种模式至少需要两个纹理,也许更多。
  • @peachykeen 感谢您的评论。层数不受限制,操作非常基础,正如您所说的添加/乘法/alpha 混合。你会为此建议我什么技术?由于我只使用 2D 图像,我可以使用 Direct2D 吗?
  • 由于您将在 D2D 或 D3D 中专门使用单个四边形,因此几乎没有性能差异。在这两者中,您将绑定一个或两个纹理,绘制到纹理并循环。它可能不一定很快,因为需要进行所有状态更改。如果您想要 GDI+ 互操作等,D2D 可能是一个不错的选择,但并不是说它会无缘无故地限制您的用户群(您不会获得性能提升或任何真正的好处)。只要您可以实现乒乓风格的渲染,也应该可以为其他模式提供任意 2 纹理着色器效果。
  • 感谢您的建议。我会尝试使用 D2D,它似乎不太复杂。

标签: c++ graphics directx photoshop


【解决方案1】:

根据您正在寻找的性能,D3D 或 D2D 会更合适。 D3D 是更多保留模式,因此使用起来更复杂的 API,但如果性能是绝对关注的问题,那么它就是您想要的。 D2D API 是更直接的模式,但这当然会导致更简单的 API 和更慢的性能。

根据我的经验,我会从 D2D 开始,特别是因为 ID2D1DeviceContext::DrawImage()ID2D1Effect 等新的 D2D API 支持许多混合和合成模式。 D2D 确实与 D3D 很好地交互操作,因此将来您可以根据需要使用 D3D 的某些部分。 D2D 还提供了一个非常漂亮的接口来支持打印,因此可以使用相同的渲染代码进行打印。

【讨论】:

  • 谢谢。对我来说,性能很重要,因为我希望能够实时渲染,但我认为我会从 D2D 开始,因为它更简单,如果不够好,请更改为 D3D。
  • 当然,但请记住,D2D 完全能够以 60 FPS 的速度进行实时渲染。 IE9 和 IE10 使用 D2D,看看一些试驾演示。
【解决方案2】:

如果您使用的是当前发布的 Direct2D 版本(不是 Win8 预览版中的更新版本),您可以使用 alpha 蒙版实现“OVER”(又名 Normal)混合。将内容渲染为 PBGRA32 位图,然后将掩码(如果需要)渲染为 Alpha8 位图。然后,从内容位图创建位图画笔,并使用 ID2D1RenderTarget::FillOpacityMask()。如果不需要遮罩,则只需使用 DrawBitmap() 并跳过位图画笔。

要实现任何其他混合模式,您将需要较新的 Direct2D,它在 Windows 8 发布之前无法供所有人使用(我认为它也可用于 Win7)。或者,当然,您可以在软件模式下执行此操作,但您必须从头开始实现所有内容。

【讨论】:

  • 我会尽量按照你说的去实现。目前,我从介绍msdn.microsoft.com/en-us/magazine/dd861344.aspx 开始。但是 CreateDeviceResources() 方法大约需要 5 秒。正常吗?我刚刚创建了 RenderTarget。
  • 谢谢,效果很好。仅 CreateHwndRenderTarget 函数大约需要 15 秒,因为我的计算机只有一个芯片组,没有显卡。这很长,因为我有几个要初始化的窗口。有没有办法优化它并使其更快?
  • 如果需要 5-15 秒那么......我不知道。希望您的视频卡驱动程序很糟糕! :( 您需要使用 Windows 性能记录器和 Windows 性能分析器之类的工具,它们是 Windows 8 评估和部署工具包 (microsoft.com/download/en/details.aspx?id=28997) 测试版的一部分,以便更深入地挖掘。或者只是在另一台机器上尝试以确保只有您的计算机出现该问题。
  • 感谢您的回复。我只是做了一个小测试,我发现了问题,这不是因为我的电脑,而是由于 Visual Studio 本身。当我使用 .exe 运行我的程序时,我没有任何问题,并且图像会立即显示。但是从视觉工作室(即使在发布模式下),它需要 15 秒。我有视觉工作室 2010。
  • 您可能已将其设置为始终加载符号,并且未正确缓存(或其他内容)。我记得我遇到了调试开始时间很长的问题(例如,调试 -> 从调试开始)。这是因为它试图从某个早已不复存在的服务器上下载符号但失败了。如果是这种情况,您应该在 VS 状态栏中看到它正在加载符号,并且速度很慢。 (抱歉,我忘记了细节,但希望这是寻找并最终解决延迟问题的正确位置。)
猜你喜欢
  • 2013-05-08
  • 2015-06-02
  • 1970-01-01
  • 2010-12-26
  • 2016-05-18
  • 2016-07-29
  • 1970-01-01
  • 2019-04-22
  • 1970-01-01
相关资源
最近更新 更多