这是您如何在 DirectX 11 中绘制文本的后续问题?
在 Direct3D-12 中,事情变得更加复杂,而且由于它是新的,我无法在网上找到任何合适的库。
我正在构建一个基本的 Direct3D12 FPS 测试应用程序,我喜欢在屏幕上显示 FPS 数据和我的渲染图像。
这是您如何在 DirectX 11 中绘制文本的后续问题?
在 Direct3D-12 中,事情变得更加复杂,而且由于它是新的,我无法在网上找到任何合适的库。
我正在构建一个基本的 Direct3D12 FPS 测试应用程序,我喜欢在屏幕上显示 FPS 数据和我的渲染图像。
对此类问题的一般回答是“如果你不得不问,那么你可能应该使用 DirectX 11”。DirectX 12 是一个图形专家 API,可提供强大的控制能力,并不特别关注新手的易用性。有关这方面的更多想法,请参阅此线程。
除此之外,一种选择是使用设备互操作和 Direct2D/DirectWrite。请参阅使用 Direct3D 11、Direct3D 10 和 Direct2D。
更新: DirectX 12的 DirectX 工具包现已推出。它包括一个SpriteFont
/SpriteBatch
实现,它将在 Direct3D 12 渲染目标上绘制文本。请参阅本教程。
纯 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 具有内置的文本绘制支持,但运行良好,后来支持精灵批量绘制,您可以在一个精灵中渲染所有文本。
说你只是“需要知道”或“不是专家”来实现这样一个基本但乏味的系统似乎倒退了。这样的系统注定会失败,就像没有人愿意使用汇编来编写他们可以用 C 和更高版本编写的东西一样。
D3D11 和 D3D12 数学库也遭受同样的失败。要定义和转换向量,最好包含 D3D9X 数学或自定义数学结构,因为包含的新方法是如此落后。“有人”做了它并且一定喜欢它,但我记得我曾抱怨过在之前和之后进行矢量运算是多么容易,它几乎是执行基本矢量运算和转换所需的行数的两倍或三倍,甚至不算数您需要查看其他人的库如何工作的参考资料和学习时间。这似乎是从不擅长编程的数学家提出的一个巨大的失败。
如果您想以最少的工作获得最大的功能集,您可能应该在 D3D11 互操作设备之上使用 DirectWrite,就像 Chuck 在他的回答中所说的那样。
如果你想推出自己的高性能文本渲染,你可能想看看github 上的 miniengine 示例存储库中的文本渲染器,它有一些有趣的想法。