你如何在DirectX 12中绘制文本?

时间:2016-04-04 04:31:03

标签: directdraw directx-12 direct3d12

这是How do you draw text in DirectX 11?

的后续问题

在Direct3D-12中,事情变得更加复杂,因为它是新的,我找不到任何合适的在线图书馆。

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

4 个答案:

答案 0 :(得分:6)

这类问题的一般答案是“如果你不得不问,那么你可能应该使用DirectX 11。” DirectX 12是一个图形专家API,提供巨大的控制,并不特别关注新手的易用性。有关这方面的更多想法,请参阅this thread

除此之外,一个选项是使用设备互操作和Direct2D / DirectWrite。请参阅Working with Direct3D 11, Direct3D 10 and Direct2D

更新: DirectX Tool Kit for DirectX 12现已推出。它包含一个SpriteFont / SpriteBatch实现,它将在Direct3D 12渲染目标上绘制文本。请参阅this tutorial

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

如果你想要最少的功能设置和最少的工作,你可能应该在D3D11互操作设备上使用DirectWrite,就像Chuck在他的回答中所说的那样。

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

答案 3 :(得分:0)

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

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

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

似乎倒退说你只是“需要知道”或“不是专家”才能实现这样一个基本而乏味的系统。这样的系统注定要以同样的方式失败,为什么没有人想使用Assembly来编写他们可以在C及以后编码的东西。

D3D11和D3D12数学库也会遇到相同的故障。要定义和转换向量,最好包括D3D9X数学或自定义数学结构,因为包含的新方法是向后的。 “有人”做了它并且必须喜欢它,但是我记得做了一个投诉,表明在之前和之后进行矢量操作是多么容易,它几乎是执行基本矢量操作和转换所需的行数的两倍或三倍,甚至不计算您需要了解其他人的lib如何工作的参考数量和学习时间。这似乎是数学家们从未擅长编程的一大失败。

相关问题