2012-04-09 117 views
1

仅使用ID3DXFont::DrawText()就能生成锯齿状字体,尤其是在字体较大的情况下。有没有办法像Windows 8 Metro UI一样使用DirectX9来非常流畅地呈现字体?如何使用DirectX9渲染超级流畅的字体?

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

+0

听起来像你正在寻找antialiasing或ClearType。 – 2012-04-09 18:32:00

+0

@MДΓΓБДLL我试过'CLEARTYPE_QUALITY'和'ANTIALIASED_QUALITY'标志。他们仍然会产生锯齿形的字体,我不会缩放它们。 – Joshua 2012-04-09 18:37:06

+0

@Joshua:请提供截图和渲染代码片段。 – SigTerm 2012-04-11 05:51:12

回答

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绘制位图。

0

您可以创建一个位图字体呈现,其范围可以从“非常简单”到“非常复杂”。

对于一个简单的方法,有这样的例子,虽然在Managed DirectX中,可以很容易地在C++/DirectX 9中完成。Bitmap Fonts。你也可以用这个免费的应用程序Bitmap Font Generator(这里还有如何创建位图渲染的链接)轻松创建位图字体表。

然后有更复杂的方法来做字体,如使用signed distanced fields,如 Improved Alpha-Tested Magnification for Vector Textures所述。

0

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

在这一点上,我实现了这一点:my distance field font