1

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

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

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

4

3 回答 3

3

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

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

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

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

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

于 2009-07-20T02:23:05.810 回答
3

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

任何方式,即使您会找到一种好的文本呈现方式,但由于ClearType Microsoft 技术,您必须使用小字体。起初,您不能只制作一个小符号矩阵来从中输入文本(因为符号是使用此子像素渲染来渲染的)。您可能需要一些特殊的着色器......或者您将被强制拒绝使用 ClearType,但正如我之前所说的那样,它对小字体有不好的影响。其次,这项技术已获得微软专利


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

于 2010-04-02T08:21:24.933 回答
0

我建议测量渲染到位图和上传到纹理的性能。我怀疑这几乎就是 D3DXFont 必须做的事情。如果需要,您可能会缓存字母/短语等

于 2009-07-21T10:30:17.857 回答