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

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

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

如果没有direct3d字体可以做到这一点,是否有任何其他渲染器(例如用于在普通窗口中渲染富文本),并将渲染到RAM中的纹理,然后将其上传到video卡以渲染到后台缓冲区产量合理performance?

Solutions Collecting From Web of "在direct3d应用程序中呈现格式化的文本"

你用Direct3D标记了这个,所以我将假定这是目标环境。 否则,GDI可以处理所有这些东西。

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

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

现在,如果你想做自己的文本渲染,你可以用着色器做更有趣的事情,但是除非你需要高质量的排版,否则它可能是不值得的。

在Windows 7中(一旦Windows 7出货,为Vista添加回补),您可以在Direct3D渲染环境(D3D​​10及更高版本)中使用DirectWrite进行高质量的排版。

在使用Direct3D9或早期的情况下,您确实遇到了很大的问题:1.您总是可以使用GDI,在HDC中渲染文本,将其复制到Direct3D动态纹理,并使用着色器通过颜色键将背景替换为透明。 2.看看FreeType库可能会比GDI更适合你,但它确实不容易。

任何方式,即使你会发现一个很好的方式,文字呈现您的义务将由于微软的ClearType技术的小字体的问题。 起初,你将无法制作一个小的符号矩阵来输入文本(因为符号是使用这个子像素渲染呈现的)。 你可能需要一些特殊的着色器…或者你会被强制拒绝使用ClearType,但是正如我之前所说的那样,它对小字体有不好的后遗症。 第二,这项技术是由微软的专利


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

我建议测量渲染到位图和上传到纹理的性能。 我怀疑D3DXFont不管怎么样都要做什么。 如果需要,你可以缓存字母/短语等