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

3

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

思考后,我意识到也许最好的实现方式是加载每个需要的字符的纹理(就像一个精灵表),获取与其相关的数据(宽度、高度、提前量、行跳过...)并在渲染时(基本上我们会在场景中所有其他渲染之后执行),我们只需要一个glBindTexture()来在屏幕上打印所需的每个字符串。

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

你们如何呈现文本? 这是一个好的呈现方式吗? 如果是,有没有已经实现的库呢?


你需要使用纹理坐标偏移来渲染纹理的不同部分。每个字形应该是一个四边形,其在图集上的单元格应有适当的坐标。 - ssube
我用完全相同的方式。不过,我使用了DirectX。如果你对这种技术感兴趣,可以查看http://sdxspritetext.codeplex.com/。 - Nico Schertler
3个回答

4
使用类似“精灵表”的纹理来渲染文本肯定可行,并且是一种非常常见的方法。虽然我不知道有哪些库可以像这样渲染文本(但我确信有),但仅编写代码应该不难。如果您想自己编写代码,请先生成一个包含所需每个字母的纹理。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 - Edmo Freitas

0
使用FreeType动态生成字形位图,并使用您选择的盒子装箱算法将它们填充到一个(或多个)大纹理中。
正如您所说,这种方式大多数字符串只需要一个或两个纹理绑定。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接