2009-07-19 73 views
1

我需要呈现某些格式化文本(颜色,不同字体大小,下划线,粗体等),但我不确定如何去做。 D3DXFont只允许一次渲染单个字体/大小/重量/颜色等的文本,我不能看到一种实际的方式来将多个调用“组合”为ID3DXFont :: DrawText来做这种事情......在direct3d应用程序中呈现格式化文本

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

如果没有direct3d字体渲染能够做到这一点,是否还有其他渲染器(例如,用于在普通窗口中渲染富文本),并将渲染为RAM中的纹理,然后将其上传到视频卡渲染到后台缓冲区中会产生合理的性能?

回答

3

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

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

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

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

在Windows 7中(一旦Windows 7发布后,为Vista重新填充),您可以在Direct3D渲染上下文(D3D10及更高版本)中使用DirectWrite进行高质量的排版。

+0

好的,TextOut ::似乎支持计算出每个块的位置,而ID3DXFont没有(即我需要为每个块计算我自己的RECT ...)。但是我也非常需要A的方法,预先计算渲染某个东西需要多少空间(例如,我可以将工具提示框扩展为所需的大小),并且B使它在特定宽度之上缠绕线(使用如果需要,可以计算所需大小以添加垂直滚动条)。 – 2009-07-20 09:29:55

+0

GDI可以做到这一点吗?我看到大量的应用程序具有丰富的文本框,可以同时处理所需的所有内容(例如,将其包装为适合框中的内容,并计算文本的“高度”,以便可以添加到垂直滚动条中)。 – 2009-07-20 09:31:22

0

我建议测量渲染到位图和上传到纹理的性能。 我怀疑D3DXFont必须做什么才能抛出场景。 你也许可以缓存字母/短语等。如果需要的话

3

在使用的Direct3D9或情况下的早期你真的有大问题:1。 你总是可以使用GDI,呈现在HDC你的文字,将其复制到Direct3D的动态纹理和使用着色器,例如通过颜色键替换背景到透明度。 2.看看FreeType库可能会比GDI更适合你,但它确实不容易。

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


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

相关问题