如何使用DirectX9渲染超流畅的字体?

时间:2012-04-09 18:29:25

标签: user-interface fonts directx rendering directx-9

单独使用ID3DXFont::DrawText()会产生锯齿状字体,尤其是在较大的字体大小时。有没有办法像Windows 8 Metro UI一样使用DirectX9非常流畅地呈现字体?

我有点想避免使用DirectWrite,因为它需要Direct2D,但我使用的是DirectX9。

3 个答案:

答案 0 :(得分:1)

DirectWrite实际上并不需要Direct2D,可以单独使用(IDWriteBitmapRenderTarget)。使用Direct2D将DirectWrite文本呈现到IWICBitmap(通过ID2D1Factory :: CreateWicBitmapRenderTarget()),然后使用DX绘制该位图(可能通过复制到DX表面,或使用某些共享表面方法;我不熟悉这里的具体细节。您可以通过IWICImagingFactory :: CreateBitmap()创建IWICBitmap。

Metro似乎没有使用ClearType,所以灰度应该没问题。正确的ClearType文本实际上需要每个组件的alpha,因此它通常无法将其呈现为带有alpha通道的位图。

您是否正在使用DX9以便在XP上运行,或者您是否因为其他原因而使用它?如果您能够将Win7或Vista SP2 +平台更新作为最低要求,那么我强烈建议您使用D2D + DW将文本渲染为位图,然后使用DX绘制位图。

答案 1 :(得分:0)

你可以创建一个位图字体渲染,范围从“非常简单”到“非常复杂”。

有一个简单的方法,就是这个例子,尽管在Managed DirectX中,可以很容易地在C ++ / DirectX 9中完成。Bitmap Fonts。您还可以使用此免费应用Bitmap Font Generator轻松创建位图字体表(此处还有指向如何创建位图渲染的链接)。

然后有更复杂的方法来处理字体,例如使用signed distanced fields中描述的 Improved Alpha-Tested Magnification for Vector Textures

答案 2 :(得分:0)

ID3DXFont无法绘制真正酷炫且流畅的字体。为了实现这一点,我为字体渲染了自己的纹理图集,然后使用带纹理的四边形绘制它。 第二种方法是以类似的方式从地图集中绘制字体,但使用距离场方法。 带有简单像素着色器的距离场将为您提供非常流畅和可缩放的字体。

此时我实现了这个目标:my distance field font