在direct3d应用程序中呈现格式化文本

时间:2009-07-19 16:44:21

标签: c++ windows direct3d text-rendering

我需要渲染一些格式化的文本(颜色,不同的字体大小,下划线,粗体等)但是我不知道如何去做。 D3DXFont只允许一次呈现单个字体/大小/重量/颜色/等的文本,我无法看到一种实用的方法来“组合”多次调用ID3DXFont :: DrawText来做这些事情......

我环顾四周,似乎没有任何现有的库可以做这些事情,但我不知道如何实现这样的文本渲染器,我甚至找不到任何关于这样的文本渲染的文档可以工作,只渲染简单的固定宽度,查看它的ASCII位图字体可能是一种完全不同的方法,仅适用于渲染Unicode不重要的简单文本块。

如果没有能够执行此操作的direct3d字体渲染器,是否有任何其他渲染器(例如用于在普通窗口中渲染富文本),并将其渲染到RAM中的纹理,然后将其上传到视频卡渲染到后台缓冲区产生合理的性能?

3 个答案:

答案 0 :(得分:3)

您使用Direct3D标记了这一点,因此我将假设这是目标环境。否则,GDI可以处理所有这些。

实际上,查看GDI是一个很好的起点,因为它支持这一点。使用GDI,一次只能选择一种字体来绘制文本。同样,一次只能选择一种文本颜色。因此,要绘制包含多种颜色和/或字体字符的文本行,您必须将该行划分为所有具有相同渲染状态的字符块。您设置该块的状态(文本前景/背景颜色,文本字体,文本间距等),然后为该文本块调用::TextOut,然后设置下一个块的状态并绘制该状态,并且所以上。

在Direct3D中应用了相同的原则。每个文本块可能需要自己的ID3DXFont(或者如果ID3DXFont不够,则需要您自己的字体机制)和颜色等。您可以设置状态,绘制文本,设置状态,绘制文本等。

现在,如果你想做自己的文字渲染,你可以用着色器做更好的事情,但它可能不值得,除非你需要真正高质量的排版。

在Windows 7中(一旦Windows 7发布后为Vista备份),您将能够在Direct3D渲染上下文(D3D10及更高版本)中使用DirectWrite进行高质量排版。

答案 1 :(得分:3)

如果使用Direct3D9或早期,您确实遇到了大问题: 1.您总是可以使用GDI,在HDC中渲染文本,将其复制到Direct3D动态纹理,并使用着色器将背景替换为透明度,例如颜色键。 2.看看FreeType图书馆可能会发现它比GDI更适合你,但这真的不容易。

任何方式即使你会找到一种好的文本渲染方式,你仍然会因ClearType Microsoft技术而导致小字体出现问题。首先,您将无法只使用小符号矩阵从中键入文本(因为符号是使用此子像素渲染渲染的)。您可能需要一些特殊的着色器......或者您将被强制拒绝使用ClearType,但正如我之前所说,它对小字体有不良后果。第二,这项技术是微软的patented


但是如果您不需要Windows XP的支持,您可以尝试将Direct2D与DirectWrite和DirectX10一起使用(我没试过11)。我试过它们并且它们显示出良好的结果,你应该避免经常在Direct2D和Direct3D上下文之间切换,因为它可能会严重降低性能。要为纹理渲染内容,可以使用ID2D1Factory :: CreateDxgiSurfaceRenderTarget函数

答案 2 :(得分:0)

我建议测量渲染到位图并上传到纹理的性能。 我怀疑这就是D3DXFont无论如何都要做的事情。 如果需要,您可以缓存字母/短语等