我正在考虑将DirectWrite用于DirectX 11版本和OpenGL 3.1+版本的项目。
据了解,DirectWrite使用位于Direct3D 10.1之上的Direct2D(直到DirectX 11.1发布)。这意味着,要将 DirectWrite 与 Direct3D 11 配合使用,目前,我必须创建一个 Direct3D 10.1 设备和一个 Direct3D 11 设备,然后在这两个设备之间共享资源,这似乎会带来一些同步开销。另一个问题是,通过此设置,我似乎无法将文本直接呈现到 d3d11 后台缓冲区,对吧......?
我也不知道是否有可能在任何实际意义上将DirectWrite与OpenGL结合起来..?我的猜测不是...
所以。。。我也在考虑编写自己的字体渲染器,我希望能够根据字体的贝塞尔样条轮廓渲染字体,以实现分辨率独立性。我知道 GetGlyphOutline() 函数,但它似乎正在被弃用并且"......不应在新应用程序中使用",根据 MSDN 库。查看MSDN的DirectWrites参考页面,我看不到任何方法可以在Bezier样条信息中获得相同的信息,就像使用GetGlyphOutline()一样。您可以获得包裹在ID2D1SimplifiedGeometrySink中的轮廓信息,但我看不出您如何从ID2D1SimplifiedGeometrySink获得纯贝塞尔曲线,控制点,信息,您只能使用它使用D2D(D3D10.1)进行绘图,此时我对此不太感兴趣。
有没有办法使用未弃用的方法、DirectWrite 或其他方法获取字体轮廓轮廓?
我对DirectWrite和Direct2D都不太熟悉,你可能知道。我试图弄清楚该采取什么方向。无论是值得走上DirectWrite/D2D之路,还是制作我自己的字体渲染器,或者其他一些绝妙的想法:)。有什么建议吗?
PS 我目前正在为 Win7 平台开发,并将在发布时迁移到 Win8。
你有点倒退。Direct2D使用DirectWrite,而不是相反。从技术上讲,您可以单独使用 DirectWrite(请参阅:IDWriteBitmapRenderTarget
)。如果处于原型制作阶段,则使用 Direct2D 将软件呈现到通过IWICImagingFactory::CreateBitmap()
创建的IWICBitmap
中可能更容易(或者只是包装已创建的位图,然后自己实现IWICBitmap
)。您可以使用 ID2D1Factory::CreateWicBitmapRenderTarget()
,调用 ID2D1RenderTarget::BeginDraw()
,然后通过 IDWriteFactory
创建IDWriteTextFormat
和/或IDWriteTextLayout
,然后在呈现器目标上调用 DrawText()
或 DrawTextLayout()
,然后EndDraw()
。然后,您复制到硬件纹理中并随心所欲地绘制它。