如何在 DirectX 12 中绘制文本?

How do you draw text in DirectX 12?

这是 How do you draw text in DirectX 11?

的后续问题

在 Direct3D-12 中,事情变得更加复杂,而且由于它是新的,我无法在线找到任何合适的库。

我正在构建一个基本的 Direct3D12 FPS 测试应用程序,我喜欢在屏幕上使用我的渲染图像显示 FPS 数据。

此类问题的一般答案是 "if you have to ask, then you probably should be using DirectX 11." DirectX 12 是图形专家 API,可提供强大的控制,并不特别关心新手的易用性。有关这方面的更多想法,请参阅

除此之外,一种选择是使用设备互操作和 Direct2D/DirectWrite。参见 Working with Direct3D 11, Direct3D 10 and Direct2D

更新: DirectX Tool Kit for DirectX 12 is now available. It includes a SpriteFont / SpriteBatch implementation that will draw text on Direct3D 12 render targets. See this tutorial.

如果您想以最少的工作量获得最大的功能集,您可能应该在 D3D11 互操作设备之上使用 DirectWrite,就像查克在他的回答中所说的那样。

如果您想推出自己的高性能文本渲染,您可能想看看 text renderer in the miniengine example repository on github,它有一些有趣的想法。

Pure DirectX 12,则需要将字体字形数据加载到顶点缓冲区并使用顶点着色器和像素着色器进行渲染。你在网上提到了图书馆,这是专家级的东西吗?幸运的是,微软的 James Stanard 发布了如何使用他们的开源 MiniEngine 项目。他处理 DirectX 12 中的多种字体、抗锯齿和投影。

在 GitHub https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/MiniEngine 找到项目文件并查看 Textrender.h 和 Textrender.cpp

不幸的是,已经描述了唯一的方法。与 DirectWrite 交互或创建字形文件系统。

你正在做的是导入一个带有字形的纹理文件,从字形纹理文件中切出每个字符周围的小方块,然后将它们粘合在一起形成一个字符串。它会导致更快的绘图(在某些情况下)。

我认为其他人引用的方法有点过时并且注定要失败。 Direct3D11 与 Direct3D12 一样缺乏文本绘制支持(可能是关于此的错误信息)。 Direct3D9 具有内置的文本绘制支持,但仍然可以正常工作,后来支持精灵批量绘制,您可以在一个精灵中渲染所有文本。

似乎倒退说您只是 "need to know" 或 "are not an expert" 来实现这样一个基本但乏味的系统。这样的系统注定会失败,就像为什么没有人愿意使用 Assembly 来编写他们可以用 C 或更高版本编写的代码一样。

D3D11 和 D3D12 数学库也有同样的问题。要定义和转换向量,最好包含 D3D9X 数学或自定义数学结构,因为包含的新方法太落后了。 "Someone" 做到了并且一定喜欢它,但我记得曾抱怨过在之前和之后进行向量运算是多么容易,它几乎使执行基本向量运算和转换所需的行数增加了一倍或三倍,而不是即使计算参考文献的数量和学习时间,您也需要查看其他人的库是如何工作的。这似乎是一向不擅长编程的数学家提出的一大失败。