3

我一直在搜索和测试用 OpenGL 渲染文本的新方法,用 SDL 加载它的纹理,但我测试的每项技术似乎都既昂贵又缓慢。

考虑到这一点,我意识到实现它的最佳方法可能是通过加载具有所需每个字符的纹理(就像精灵表一样),获取有关它的相关数据(宽度,高度,前进,跳行......)以及何时渲染它(基本上我们会在场景中的所有其他渲染之后进行),我们只需要一个 glBindTexture() 来打印屏幕上需要的每个字符串。

我在这里假设它的昂贵部分是纹理创建和绑定,对吗?我测试的每个代码似乎都对每个字形或每个字符串使用了分离的纹理。

你们如何渲染文本?是渲染它的好方法吗?如果是这样,是否有任何库已经这样做了?

4

3 回答 3

4

通过使用带有每个字母的“spritesheet like”纹理来渲染文本肯定会起作用,并且是一种非常常见的方法。

虽然不知道有任何库可以呈现这样的文本(我敢肯定有),但自己编写代码确实不难。如果您想编写自己的代码来执行此操作,您将需要某种方法来生成包含您需要的每个字母的纹理。BMFont是一款可以生成此类纹理的程序。此外,BMFont 生成一个随附的“.fnt”文件,指示每个字母在纹理中的位置。

下面是 BMFont 生成的纹理的样子:

大小为 22 Times New Roman 的 BMFont 纹理

和 .fnt 文件:

info face="Times New Roman" size=-22 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=25 base=20 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
page id=0 file="Times22.png"
chars count=191
char id=32   x=253   y=37    width=1     height=1     xoffset=0     yoffset=20    xadvance=6     page=0  chnl=15
char id=33   x=253   y=21    width=2     height=15    xoffset=2     yoffset=5     xadvance=6     page=0  chnl=15
char id=34   x=195   y=118   width=6     height=6     xoffset=2     yoffset=5     xadvance=9     page=0  chnl=15
char id=35   x=72    y=42    width=11    height=16    xoffset=0     yoffset=4     xadvance=11    page=0  chnl=15
char id=36   x=17    y=43    width=9     height=17    xoffset=1     yoffset=4     xadvance=11    page=0  chnl=15
...
于 2012-08-25T00:55:26.637 回答
0

使用 FreeType 动态生成字形位图,并使用您选择的盒子打包算法将它们填充到一个(或多个)大纹理中。

正如你所说的那样,大多数字符串只需要一个,也许两个纹理绑定。

于 2012-08-22T21:00:10.793 回答
0

这是另一个可以构建紧凑字体位图的工具,可选择包括字距调整,并包含用于加载和显示字体的源代码

https://github.com/SudoMike/SudoFont

于 2014-05-09T21:57:48.027 回答