0

我正在考虑可能将 DirectWrite 用于将在 DirectX 11 版本和 OpenGL 3.1+ 版本中出现的项目。

据了解,DirectWrite 使用位于 Direct3D 10.1 之上的 Direct2D(直到 DirectX 11.1 发布)。这意味着要在 Direct3D 11 中使用 DirectWrite,目前,我必须创建一个 Direct3D 10.1 设备和一个 Direct3D 11 设备,然后在这两个设备之间共享资源,这似乎带来了一些同步开销。另一个问题是我似乎无法通过这种设置将文本直接渲染到 d3d11 后备缓冲区,对吧...?

我也不知道是否有可能在任何实际意义上将 DirectWrite 与 OpenGL 结合起来..?我的猜测不是...

太好了......我也在考虑编写自己的字体渲染器,我希望能够根据它们的贝塞尔样条轮廓来渲染字体,以实现分辨率独立。我知道 GetGlyphOutline() 函数,但根据 MSDN 库,它似乎正在被弃用并且“......不应在新应用程序中使用”。查看 MSDN 上的 DirectWrites 参考页面,我看不到任何方法可以像使用 GetGlyphOutline() 那样在 Bezier 样条信息中获得相同的信息。您可以获得包含在 ID2D1SimplifiedGeometrySink 中的轮廓信息,但我看不到您如何从 ID2D1SimplifiedGeometrySink 中获得纯贝塞尔曲线、控制点、信息,您只能将其用于使用我的 D2D(D3D10.1)进行绘图在这一点上没有那么感兴趣。

有没有办法使用非弃用方法 DirectWrite 或其他方法来获取字体轮廓轮廓?

正如您可能知道的那样,我对 DirectWrite 和 Direct2D 都不太熟悉。我试图弄清楚该采取什么方向。是否值得走 DirectWrite/D2D 道路,或者制作我自己的字体渲染器,或者其他一些绝妙的想法 :)。有什么建议么?

PS我目前正在为Win7平台开发,发布后会迁移到Win8。

4

1 回答 1

3

幸运的是你有一点倒退。Direct2D 使用 DirectWrite,而不是相反。从技术上讲,您可以单独使用 DirectWrite(请参阅:IDWriteBitmapRenderTarget)。如果您处于原型设计阶段,使用 Direct2D 将软件渲染到IWICBitmap创建的通过IWICImagingFactory::CreateBitmap()(或者只是包装您已经创建的位图并IWICBitmap自己实现)可能会更容易。您使用ID2D1Factory::CreateWicBitmapRenderTarget(),调用ID2D1RenderTarget::BeginDraw(),然后创建您的IDWriteTextFormat和/或IDWriteTextLayout通过IDWriteFactory,然后在渲染目标上调用DrawText()或,然后。然后你复制到一个硬件纹理中,然后按照你喜欢的方式绘制它。DrawTextLayout()EndDraw()

于 2012-06-28T07:49:47.730 回答