使用DirectX(2D)创建多层渲染

时间:2012-02-22 02:49:00

标签: c++ graphics directx photoshop

我是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。如果我必须对着色器进行编程......那么这个项目的最佳做法是什么?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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