使用单一字体纹理(SDL + OpenGL)渲染文本

时间:2012-08-22 16:45:23

标签: opengl fonts rendering sdl sdl-ttf

我一直在寻找和测试用OpenGL渲染文本的新方法,用SDL加载它的纹理,但是我测试它的每一项技术似乎都很昂贵而且很慢。

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

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

你们如何渲染文字? 这是渲染它的好方法吗? 如果是的话,是否有任何已经存在的lib?

3 个答案:

答案 0 :(得分:4)

使用“spritesheet like”纹理渲染文本,每个字母都可以使用,这是一种非常常见的方式。

虽然不知道有任何库来渲染这样的文本(我确定有),但实际上不应该自己编写代码。如果你想编写自己的代码来做,你需要一些方法来生成一个包含你需要的每个字母的纹理。 BMFont是一个可以生成此类纹理的程序。此外,BMFont会生成一个附带的“.fnt”文件,指示每个字母在纹理中的位置。

以下是BMFont生成的纹理可能如下所示:

BMFont texture for size 22 Times New Roman

和.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
...

答案 1 :(得分:0)

使用FreeType动态生成字形位图,并使用box packingyour choice算法将其填充到一个(或多个)大纹理中。

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

答案 2 :(得分:0)

这里的another one可以构建紧凑的字体位图,可选择包括字距调整,并包含加载和显示字体的源代码

https://github.com/SudoMike/SudoFont