字体轮廓贝塞尔样条轮廓和DirectWrite

时间:2012-06-24 15:02:19

标签: c++ opengl fonts directx directwrite

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

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

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

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

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

我不熟悉DirectWrite和Direct2D,你可能会说。我想弄清楚要采取的方向。是否值得沿着DirectWrite / D2D路走下去,或者制作我自己的字体渲染器,还是其他一些好主意:)。有什么建议吗?

PS我目前正在为Win7平台开发,并将在发布时迁移到Win8。

1 个答案:

答案 0 :(得分:2)

幸运的是,你有点倒退了。 Direct2D使用DirectWrite,而不是相反。您可以在技术上单独使用DirectWrite(请参阅:IDWriteBitmapRenderTarget)。如果您处于原型设计阶段,可能更容易使用Direct2D将软件渲染到通过IWICBitmap创建的IWICImagingFactory::CreateBitmap()(或者只是包装您已经创建的位图,并实现{{ 1}}你自己)。您使用IWICBitmap,拨打ID2D1Factory::CreateWicBitmapRenderTarget(),然后通过ID2D1RenderTarget::BeginDraw()创建IDWriteTextFormat和/或IDWriteTextLayout,然后拨打IDWriteFactory或{{1在渲染目标上,然后DrawText()。然后将其复制到硬件纹理中,然后根据需要绘制它。