【问题标题】:DirectX Font tutorial that doesn't use GDI不使用 GDI 的 DirectX 字体教程
【发布时间】:2010-10-04 05:43:12
【问题描述】:

是否有任何关于在不使用 GDI 的原生 directx 9 中创建和渲染字体的教程/信息? (例如不使用 ID3DXFont)。
我读到这不是最好的解决方案(由于访问 GDI),但是在 dx 中呈现字体的“正确”方法是什么?

【问题讨论】:

    标签: c++ fonts directx


    【解决方案1】:

    我个人认为 ID3DXFont 是要走的路。 如果您真的想制作自己的字体例程,我建议您查看: http://creators.xna.com/en-us/utilities/bitmapfontmaker

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

    还有很多工作要做,但您不需要在目标 PC 上安装字体,而且您可以进入 Photoshop 并在那里编辑字体外观。

    【讨论】:

      【解决方案2】:

      ID3DXFont 是一个易于使用、早期调试输出的好东西。但是,它确实使用 GDI 进行字体光栅化(不是硬件加速),并且对性能有很大影响(尝试一下,它实际上非常明显)。不过,从 DirectX 11 开始,字体将使用 Direct2D 呈现并进行硬件加速。

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

      【讨论】:

        【解决方案3】:

        使用 DirectX,渲染标准字体的正确方法是使用 GDI。

        但是,如果

        • 您希望支持跨平台字体渲染
        • 适当支持国际化 - 包括远东语言,其中为字体中的每个字符维护字形是不切实际的
        • 和/或您想分发自己的字体并在不“安装”它们的情况下渲染它们...

        那么libfreetype 可能就是您要找的。我并不认为这很容易:它比使用原生字体 api 复杂得多。

        【讨论】:

          【解决方案4】:

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-29
            • 1970-01-01
            • 2022-12-11
            • 1970-01-01
            • 2017-07-24
            • 2019-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多