2012-04-09 119 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