1

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

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

4

3 回答 3

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

于 2012-04-10T18:32:39.897 回答
0

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

对于一个简单的方法,有这个例子,虽然它是在托管 DirectX 中,但可以很容易地在 C++/DirectX 9 中完成。位图字体。您还可以使用这个免费的应用程序位图字体生成器轻松创建位图字体表(这里还有如何创建位图渲染的链接)。

然后有更复杂的方法来制作字体,例如使用带符号的距离字段,如 改进的矢量纹理的 Alpha 测试放大率中所述。

于 2012-04-11T03:18:04.030 回答
0

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

在这一点上我实现了这一点:我的距离场字体

于 2012-10-24T10:24:21.563 回答