如何有效且正确地调整 ID3DXFont 的大小

How to efficiently and correctly resize 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 );

我怎样才能做到这一点?我尝试使用 scale/rotate/transform 来简单地更改大小,但字体变得模糊,所以我正在寻找更 "correct" 的解决方案。

谢谢。

您遇到的问题是 'raster bitmap' 字体的基本限制,而不是像 TrueType 这样的 'vector' 字体。 D3DXFont 是一种 'raster bitmap' 解决方案,可将 TrueType 字体捕获到特定大小的位图中。这可能有点 scaled/rotated 并且仍然有效,但是如果像您看到的那样大幅度改变大小,您会得到伪像。

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

D3DXFont is part of D3DX9 which means it is deprecated. Of course Direct3D 9 is legacy too, so you should look at Direct3D 11 and SpriteFont/SpriteBatch in the DirectX Tool Kit for a modern 'raster bitmap' font solution.

高质量、高度可扩展的文本绘图的正确解决方案是使用 'vector font' 绘图系统,例如 DirectWrite