如何在 Direct3D 11 上使用字体文件渲染文本?

How can I render text using font files on Direct3D 11?

我已经阅读了很多关于此的问题,但它们不能满足我正在尝试做的事情。我正在尝试为我的应用程序中的文本字体使用 TTF 文件,我想过使用 Direct Draw,但是 Microsoft 网站上的 tutorial 只解释了如何将它与 Direct2D 一起使用。我应该如何从该文件加载数据并使用该文件的字体为我的 Direct3D 应用程序呈现文本?我也读过 AddFontResourceExA() 函数,但我没有找到任何关于如何使用它的内容。我真的迷路了,所以感谢任何帮助。

在 Direct3D 11 渲染目标/纹理上渲染文本基本上有两种方法。

  1. 渲染使用 'sprite sheet'。在这里,您以特定分辨率捕获字体并从中生成纹理。然后使用纹理将字形渲染为带纹理的三角形。这是非常快速且渲染成本低廉的,但不能缩放到任意分辨率(您可以捕获多个点大小的 'sprite sheet' 以获得一些缩放比例)并且由于尺寸大而不适用于“CKJ”语言的字体。有关此示例,请参阅 DirectX Tool Kit 中的 SpriteFont。这也是 legacy D3DX9/D3DX10 所做的。

  2. 直接使用矢量字体渲染。这里有某种库可以从“TrueType”矢量字体数据生成三角形 'on-the-fly'。这就是 Direct2D+DirectWrite 的设计目的。您可以将 interop 与 Direct3D 11 表面一起使用,但本质上您使用的是 DirectWrite -> Direct2D -> 共享纹理。然后用 Direct3D 将共享纹理绘制为 'sprite'。这设置起来更复杂,但会导致任意分辨率缩放、支持大字符集字体并处理复杂的书写系统。