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