有没有人有任何教程/信息用于在不使用 GDI 的本机 directx 9 中创建和渲染字体?(例如不使用 ID3DXFont)。
我读到这不是最好的解决方案(由于访问 GDI),但是在 dx 中呈现字体的“正确”方法是什么?
4 回答
为什么这不是一个好的解决方案?
将 GDI 渲染和 D3D 渲染混合到同一个窗口中是一个坏主意。
但是,ID3DXFont 不使用它。它使用 GDI 将字形光栅化为纹理。并使用该纹理来渲染实际文本。
唯一的选择是使用另一个库(例如 FreeType)将字形光栅化为纹理,但我不确定这是否会带来任何实质性的好处。
当然,对于简单(例如非亚洲)字体,您可以预先将所有字形光栅化为纹理,然后使用该纹理在运行时绘制文本。这种方式运行时不需要使用任何字体渲染库,它只是使用纹理绘制四边形。这种方法不适用于大字体或具有大量字符的字体。也不能很好地处理复杂的排版(例如必须加入字母等)
ID3DXFont 是一款易于使用、早期调试输出的好东西。但是,它确实使用 GDI 进行字体光栅化(不是硬件加速)并且对性能有很大影响(尝试一下,它实际上非常明显)。不过,从 DirectX 11 开始,字体将使用 Direct2D 呈现并进行硬件加速。
呈现文本的最快方法是使用所谓的“位图字体”。我将解释如何做到这一点,除了有很多不同的方法可以实现这种技术,每种方法的复杂性和功能都不同。它可以像加载预先创建的纹理并从中绘制字母的系统一样简单,也可以像在 Windows 中静默注册字体并在加载时在内存中创建纹理的系统一样简单(我与朋友开发的引擎这样做,它非常光滑)。无论哪种方式,您都应该看到位图字体的性能显着提高。
使用 DirectX,渲染标准字体的正确方法是使用 GDI。
然而,如果
- 你想支持跨平台字体渲染
- 适当支持国际化 - 包括远东语言,其中为字体中的每个字符维护字形是不切实际的
- 和/或您想分发自己的字体并在不“安装”它们的情况下渲染它们......
那么libfreetype可能就是您正在寻找的东西。我并不认为这很容易:它比使用原生字体 api 复杂得多。
我个人认为 ID3DXFont 是要走的路。如果你真的想制作自己的字体例程,我建议你看看: http ://creators.xna.com/en-us/utilities/bitmapfontmaker
您可以使用它来创建一个位图,上面印有所有字符。然后它只是一个问题或加载纹理并将相关字符blitting到屏幕上的正确位置。(这是 XNA 用于其字体绘制的内容)
它的工作量要大得多,但您不需要在目标 PC 上安装字体,并且您可以进入 Photoshop 并在那里编辑字体外观。