首页 > 解决方案 > 如何有效且正确地调整 ID3DXFont 的大小

问题描述

我正在寻找在 for 循环中调整 DirectX 字体对象的大小。请参阅下面的示例:

for ( int i = 1; i < 20; i++ ) {
    // font size should be i
}

为每种可能的尺寸创建字体效率低下,所以我想知道是否可以创建某种包装器或我自己的字体渲染器,让我能够以良好的性能做到这一点?

如果我没有多大意义,那么请看下面的另一个示例:

// DirectX9
// calling D3DXCreateFont every loop would be incredibly inefficient.

ID3DXFont *example_font;
D3DXCreateFont( device, 14 /* font size - we want this to change */, ..., &example_font );

我怎样才能做到这一点?我尝试使用缩放/旋转/变换来简单地更改大小,但字体变得模糊,所以我正在寻找更“正确”的解决方案。

谢谢你。

标签: c++directxdirectx-9

解决方案


您遇到的问题是“光栅位图”字体的基本限制,而不是像 TrueType 这样的“矢量”字体。D3DXFont 是一种“光栅位图”解决方案,可将 TrueType 字体捕获到特定大小的位图中。这可以稍微缩放/旋转并且仍然保持不变,但是如果您像您所看到的那样改变大小,您会得到伪影。

但是,它非常快,因为它只是在绘制纹理。您还可以捕获几种不同大小的字体并根据分辨率选择一种。

D3DXFont 是 D3DX9 的一部分,这意味着它已被弃用。当然 Direct3D 9 也是旧版,因此您应该查看 Direct3D 11 和DirectX 工具包SpriteFont/SpriteBatch中的现代“光栅位图”字体解决方案。

高质量、高度可扩展的文本绘图的正确解决方案是使用像DirectWrite这样的“矢量字体”绘图系统。


推荐阅读