2009-01-29 46 views
0

有没有人有任何教程/信息用于在不使用GDI的本机DirectX 9中创建和渲染字体? (例如,不使用ID3DXFont)。
我在读这不是最好的解决方案(由于访问GDI),但什么是“正确”的方式来呈现字体在DX?不使用GDI的DirectX字体教程

回答

1

ID3DXFont是易于使用,早期调试输出的好东西。但是,它确实使用GDI进行字体光栅化(而不是硬件加速),并且有明显的性能下降(尝试它,其实非常明显)。但是,从DirectX 11开始,字体将使用Direct2D进行渲染并进行硬件加速。

渲染文本的最快方法是使用所谓的“位图字体”。我会解释如何做到这一点,除了有很多不同的方法来实现这种技术,每种方法的复杂性和能力都不相同。它可以像加载预先创建的纹理并从中绘制字母的系统一样简单,也可以是一个系统,它默默地用Windows注册字体,并在加载时在内存中创建纹理(我与朋友一起开发的引擎做到了这一点,它非常光滑)。无论哪种方式,您都应该看到位图字体的性能提升非常明显。

1

为什么这不是一个好的解决方案?

将GDI渲染和D3D渲染混合到同一个窗口中是一个坏主意。

但是,ID3DXFont不使用它。它使用GDI将字形栅格化为纹理。并使用该纹理来渲染实际文本。

关于唯一的选择是使用另一个库(例如FreeType)将字形栅格化为纹理,但我不确定这是否会带来任何实质性好处。

当然,对于简单的(例如非亚洲)字体,您可以事先将所有字形栅格化为纹理,然后使用该纹理在运行时绘制文本。这种方式运行时不需要使用任何字体渲染库,它只是使用纹理绘制四边形。这种方法在大字号或带有大量字符的字体时效果不佳。也不能很好地处理复杂的排版(例如,必须加入字母等)

0

使用DirectX时,使用GDI呈现标准字体的正确方法是使用GDI。

但是,如果

  • 要支持跨平台的字体渲染
  • 与国际化的适当的支持 - 包括远东语言,保持了字形在字体中的每个字符是不切实际
  • 和/或你想分发你自己的字体并渲染它们而不用“安装”它们...

然后libfreetype可能是你在找什么。我不认为它很容易:它比使用本机字体API复杂得多。

0

就我个人而言,我认为ID3DXFont是要走的路。 如果你真的想使自己的字体程序,我建议你看看: http://creators.xna.com/en-us/utilities/bitmapfontmaker

您可以使用它来创建位图印上的所有字符。然后,它只是一个问题或加载纹理和blitting相关的字符在正确的地方在屏幕上。(这是XNA用于其字体绘图的东西)

它有很多工作,但是您不需要将字体安装到目标PC上,而且您可以利用它来进入Photoshop和在那里编辑字体外观。