单独使用ID3DXFont::DrawText()
会产生锯齿状字体,尤其是在较大的字体大小时。有没有办法像Windows 8 Metro UI一样使用DirectX9非常流畅地呈现字体?
我有点想避免使用DirectWrite,因为它需要Direct2D,但我使用的是DirectX9。
答案 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