此代碼允許您在自己的OpenGL應用程序中渲染高性能文本。字體渲染庫的設計易於使用和渲染性能。我已經在2010年〜2010年寫了它,並不時更新。該庫讀取的字體文件遵循為BM字體生成器開發的格式:http://angelcode.com/products/bmfont/。字體文件附有紋理文件。該庫支持標準的RGBA紋理,單個通道SDF,甚至是多通道SDF。

敬請關注。
字體庫分為以下文件:
繪圖函數調用執行以下操作:接收字符串→解析字符串→創建四Quads→將其轉換為頂點緩衝區數組 - >繪製所有紋理的三角形。在解析過程中,檢查要繪製的字符串是否為當前字體無法繪製的字符,這些字符將被繪製為問號。對於字符串中的每個字符,將創建一個四邊形並添加到最終的四列列表中,此四Quad包含有關屏幕上的位置和大小的信息(2D,正交!),以及位於位圖字體中該字符的紋理坐標。四邊形的位置取決於字符串的起始位置和上一個字符的位置。一個字符的間距與下一個之間的特定關係稱為kerning。字體配置文件包含一個具有該特定字體的所有kerning信息的表。例如,如果“ a”遵循“ m”,則需要分開一個像素,但是當“ o”遵循“ m”時,它是減一個像素或零像素。這些信息在內部存儲在二維數組中,以進行快速訪問。為了使此繪圖足夠快,有關角色和角色界定(例如Kerning)的所有信息以及程序啟動時的紋理。可以存儲文本,以便不必在每個渲染循環迭代中創建頂點緩衝區。
通過查看此存儲庫提供的示例實現,查看庫的工作方式以及如何在項目中使用它的最簡單方法。但是,如果您需要更多信息,請閱讀本章的其餘部分。
您將需要將Overiew中提到的10個文件複製到項目文件夾中。
在您的代碼中,在打開渲染上下文之前,創建一個全局字體庫對象,例如:
// load openGL fonts
m_fontLibrary = new CFontLibrary(<PathToFontFolder>);
if (!m_fontLibrary-> ParseAllFontsInFolder ())
return; // no fonts found!這將加載存儲在您指定為輸入參數的文件夾中的所有字體。創建渲染上下文後,紋理需要加載,就像這樣:
// init font library from the current rendering context!
theApp.m_fontLibrary-> InitGLFonts ();例如,可以在該渲染上下文的一次初始化函數中完成。請記住,您不能與此庫之間共享兩個或多個上下文之間的紋理(我沒有實施它,因為當時沒有有效的方法,只有一些NVIDIA卡可以而且只有某種)。因此,您必須針對每個新的渲染上下文調用它。完成此操作後,就可以使用字體庫,這意味著您可以從fontlibrary對象調用drawString()方法。
(注意:本章需要進行大修,唯一正確正確,缺少某些函數參數,但無論如何還是自我解釋的)。
void DrawString ( const std::string& textToDraw, int x, int y, float color[ 4 ], const std::string& font, float scale = 1 . 0f );參數如下所述。
| 範圍 | 描述 |
|---|---|
| const std :: string&texttodraw | 繪製為std :: string,未識別字符的字符串被繪製為'? '。哪些字符是有效的,取決於所使用的字體,在創建字體bitmap時可以定義。 |
| int x | 屏幕坐標中字符串開始的X位。 0-寬度 |
| int y | 屏幕坐標中字符串開始的Y位。 0-高度 |
| 浮子顏色[4] | Float Array包含用於調節紋理的顏色信息。顏色信息是從0.0到1.0(包含)的值,按以下標準順序:{r,g,b,alpha}顯然。 |
| const std :: string&font | 此參數定義要使用的字體類型。只能使用文件夾中的字體類型,並在加載時間使用。您可以通過該字體的文件名傳遞,而無需擴展名或更多代碼可讀性和安全性,請使用文件定義:fontlibrary.h。注意:如果要打印粗體或斜體,則必須使用設置的字體來執行此操作。 |
| 浮子刻度 | 對於RGBA紋理,強烈建議使用默認值:1.0F。您可以擴大或向下擴展,但是應該很明顯,這會導致模糊。但是,使用SDF和MSDF,您應該能夠在看到工件之前進一步擴展。 |
請注意,還有更多功能具有其他功能,例如自動線路斷路。請參閱字體庫標頭文件。另請注意,要繪製的字符串將在10922個字符後切斷。如果您出於任何奇怪的原因需要更多的字符,只需使用其他拉動呼叫,然後將字符串分為部分即可。
本章關注將自己的字體添加到字體庫中。
請注意,我在這裡專注於非SDF字體。 SDF字體的步驟非常相似,但是BM-FONT-GEN不夠。您仍然可以使用該工具,但是您需要使用ImageMagick之類的工具執行後處理步驟。下面的教程。
僅需三個步驟即可集成新字體:1。使用BM-Font-generator 2創建字體config和font-bitmap。
在下一節中,詳細描述了BM-Font Generator的使用,但首先是一些註釋。您生產的每個字體文件僅包含固定尺寸的字體,也已經由文件定義,無論是大膽還是斜體等。概述,字體的平滑度等相同的計數。隨著以下部分,此問題將變得更加清晰。
為了生成字體config以及實際的字體位圖,我使用Angel Code的“位圖字體生成器”。可以從他們的網站上獲得:http://angelcode.com/products/bmfont/安裝後,打開程序,應在下圖中看起來像。

作為第一步,通過單擊選項→字體設置或擊中[F],打開字體插條,該窗口將打開一個新窗口,如下圖所示。

製作這些設置後,關閉字體設置窗口並繼續下一步。
回到程序的主窗口中,您現在可以選擇要包含的字符集。您可以選擇完整的集合,也可以僅選擇集合的特定字符。例如,請參見下圖。

作為基本規則,僅選擇您可能使用的字符,這節省了處理時間,而大多數內存,而不僅僅是一個字符,而是更多(kerning,bitmap大小,代碼中的數組大小等)。選擇所有字符後,您的字體應包括,請繼續下一節。
現在是時候將字體作為位圖導出並為其創建配置文件了。打開我擊中的導出選項,或單擊選項→導出選項。應該彈出一個新窗口,看起來像下圖。

完成這些設置後,關閉窗口並繼續下一步。
為確保您的紋理既不太大也不太小,請在主窗口中點擊[V],或單擊選項→可視化。如果窗口標題說出“預覽1/1”,那麼您的紋理太小,對於所有角色而言,該程序將產生一個以上的位圖。在這種情況下,打開導出選項並增加紋理大小。注意:它不需要平方或兩個功率,這僅在OpenGL版本1中,案例。但是,我仍然建議這樣做,因為某些與紋理相關的功能可能仍在為其進行優化。 fontlibrary故意處理一個“頁面”或紋理不超過一個“頁面”或紋理,因為這意味著在一個繪製調用期間綁定/解開紋理,這很慢!因此,將其恰好使其完整地完成。另一方面,如果您看到字符僅填充位圖的一部分,請在可能的情況下減少紋理大小,但這並不重要。一旦對紋理空間的使用感到滿意,請繼續進行下一步。
現在已經進行了所有設置,是時候導出字體了。單擊選項→將bitmap-font另存為..。您在此處指定的文件名會影響字體庫中字體的名稱,因此請明智地選擇它。出於方便和可讀性原因,我建議以下命名約定:
<迭代? > <bold> <_概述? size? >
這裡有幾個例子:
點擊保存以完成過程。現在要做的就是將該字體的兩個文件複製到軟件的字體文件夾中。您可以使用另一個工具將TGA轉換為PNG,只需記住正確更改FNT文件中的文件擴展名即可。
這是一個三步過程。
首先,如上所述使用BMFONT發電機。但是,然後使用以下設置可能不同的形式您以前使用的內容。
最後,您需要使用ImageMagick(https://imagemagick.org/index.php)或類似的工具將紋理文件轉換為SDF。 ImageMagick安裝後,從命令行中運行以下內容(示例是Windows Power Shell,但對於Unix非常相似):
magick convert --% Arial400_0.tga -filter Jinc ( +clone -negate -morphology Distance Euclidean -level 50%,-50% ) -morphology Distance Euclidean -compose Plus -composite -level 45%,55% -resize 25% Arial400_0.png
接下來,我們需要編輯FNT文件。在Chars定義之前,將以下內容添加到FNT標頭:
fieldType=sdf
這將告訴字體LIB使用此字體時使用單個通道SDF著色器。
對於多通道SDFS,您不能使用BM字體生成器,而是使用:https://soimy.github.io/msdf-bmfont-xml/使用此工具,您需要從TTF文件開始,但是您將收到常用的FNT加上PNG文件。安裝後,從命令行運行以下內容:
msdf-bmfont -o multisdf.png cour.ttf
請注意,您也可以通過命令行提供字體大小和其他參數。
這是可選的:為您添加到fontlibrary的每個新字體定義一個定義。 H,這應該使編碼更容易!
// font type defines, string must match the filename without extension in your fonts folder!
# define GLFONT_COURIER42_MSDF " Courier42_msdf "
# define GLFONT_ARIAL20 " Arial20 "
# define GLFONT_DINNEXTLTPROMED_SDF " DINNextLTProMED_SDF "..在這裡添加您自己的定義!