簡體   English   中英

在Direct3D應用程序中渲染格式化的文本

[英]Rendering formatted text in a direct3d application

我需要渲染一些格式化的文本(顏色,不同的字體大小,下划線,粗體等),但是我不確定該怎么做。 D3DXFont只允許一次渲染單個字體/大小/粗細/顏色/等的文本,而我看不到“組合”對ID3DXFont :: DrawText的多次調用來執行此類操作的實用方法...

我環顧四周,似乎沒有現成的庫可以做這些事情,但是我不知道如何實現這樣的文本渲染器,甚至找不到關於這種文本渲染如何工作的文檔,僅呈現簡單的固定寬度的ASCII位圖字體,這可能是一種完全不同的方法,僅適合呈現Unicode不重要的簡單文本塊。

如果沒有Direct3d字體渲染器能夠執行此操作,那么是否還有其他渲染器(例如,用於在普通窗口中渲染富文本格式),並將其渲染到RAM中的紋理,然后將其上載到視頻卡以渲染到后台緩沖區產生合理的性能?

您用Direct3D標記了它,因此我將假定這是目標環境。 否則,GDI可以處理所有這些事情。

實際上,查看GDI是一個不錯的起點,因為它可以支持目前的情況。 使用GDI,一次只能選擇一種字體來繪制文本。 同樣,一次只能選擇一種文本顏色。 因此,要繪制一行包含多種顏色和/或字體的字符的文本行,您必須將行划分為全部具有相同渲染狀態的字符塊。 您可以為該塊設置狀態(文本前景色/背景色,文本字體,文本間距等),然后為該文本塊調用::TextOut ,然后為下一個塊設置狀態並進行繪制,如此-上。

Direct3D中應用了相同的原理。 每個文本塊可能需要自己的ID3DXFont (如果ID3DXFont不夠,則需要您自己的字體機制)和顏色等。您可以設置狀態,繪制文本,設置狀態,繪制文本等。

現在,如果您想進行自己的文本渲染,則可以使用着色器進行更奇特的操作,但是除非您需要真正高質量的排版,否則這樣做可能不值得。

在Windows 7中(Windows 7發行后將回填為Vista),您將能夠在Direct3D渲染上下文(D3D10及更高版本)中使用DirectWrite進行高質量排版。

如果使用Direct3D9或更早版本,您確實會遇到很大的問題:1.您總是可以使用GDI,在HDC中渲染文本,將其復制到Direct3D動態紋理中,並使用着色器通過例如顏色鍵將背景替換為透明度。 2.看一下FreeType庫,也許您會發現它比GDI更適合您,但是確實不容易。

無論如何,即使您找到了一種很好的文本呈現方式,但由於ClearType Microsoft技術,遺忘的字體都會出現小字體問題。 起初,您將不能僅制作一個由小符號組成的矩陣來輸入文本(因為使用此子像素渲染來渲染符號)。 您可能需要一些特殊的着色器...或者您將被強制拒絕使用ClearType,但是正如我之前所說的,它對小字體具有不良的后效應。 第二,這項技術已獲得 Microsoft的專利


但是,如果您不需要Windows XP的支持,則可以嘗試將Direct2D與DirectWrite和DirectX10一起使用(我沒有嘗試11)。 我嘗試了它們,並顯示出良好的效果,您只應避免經常在Direct2D和Direct3D上下文之間切換,因為這可能會嚴重降低性能。 要渲染某些東西到您的紋理,您可以使用ID2D1Factory :: CreateDxgiSurfaceRenderTarget函數

我建議測量渲染到位圖並上傳到紋理的性能。 我懷疑無論如何D3DXFont都必須這樣做。 如果需要,您可能會緩存字母/詞組等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM