如何在Direct3D9中呈现格式化文本?

时间:2010-02-07 12:21:35

标签: windows direct3d direct3d9

我正在编写一个需要在Direct3D9中绘制大量文本的应用程序 - 几行,可能是几十行。文本可以是大量格式化的(即不同的字体,样式,大小),并且可以包含来自不同字符集的unicode符号。最糟糕的是,它可以随时改变,因此它需要是动态的(渲染一旦显示总是不行)。

有两个问题:首先,我可能需要大量调用D3DXCreateFont,这些调用本来就很昂贵(我不确定自己)。另一种方法是在绘制多部分线之前创建所有字体,然后在它们之间切换 - 这样更好吗?好吧,我还可以在绘制线条时动态创建字体对象,将它们添加到某种字体对象缓存中,然后在尝试创建新缓存之前查看缓存?您怎么看?哪种方法最好?

第二个问题是D3DXFont似乎不理解下划线/删除字体样式。虽然D3DFONT基于LOGFONT,但它省略了这些字段(尽管支持斜体)。假设我真的需要强调/突破,我该怎么办?有没有办法强制ID3DXFont做下划线?我应该自己画那些线(我怎么快速做到这一点)?或者也许我应该转而在HDC上使用GDI进行绘图,然后将这些像素复制到纹理中 - 这样可以提供合理的性能吗?

1 个答案:

答案 0 :(得分:0)

  

好吧,我还可以在绘制线条时动态创建字体对象,将它们添加到某种字体对象缓存中,然后在尝试创建新缓存之前查看缓存?您怎么看?哪种方法最好?

缓存方法。甚至不要尝试在需要时即时重新创建字体,而不进行缓存。我不知道D3DXCreateFont的实际成本,但该功能的设计并非过于频繁。

关于下划线/删除线 - 您可以使用带有IDirect3DDevice9::DrawPrimitiveUP的{​​{1}}和直通着色器将线条渲染到最顶层,以保持线条顶点不变且不变换。

  

或许我应该转而使用HDC上的GDI绘图,然后将这些像素复制到纹理中 - 这会提供合理的性能吗?

我不会因为它需要将纹理内容从系统RAM传输到VRAM。