此代码允许您在自己的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 "..在这里添加您自己的定义!