我一直在寻找和测试用OpenGL渲染文本的新方法,用SDL加载它的纹理,但是我测试它的每一项技术似乎都很昂贵而且很慢。
考虑到这一点,我意识到实现它的最佳方法可能是加载一个纹理,包含所需的每个字符(就像一个spritesheet),获取相关的数据(宽度,高度,前进,跳过行...并且在渲染时(基本上我们会在场景上的所有其他渲染之后执行),我们只需要一个glBindTexture()来打印屏幕上所需的每个字符串。
我在这里假设它的昂贵部分是纹理创建和绑定,对吗? 我测试的每个代码似乎都使用分离的纹理到每个字形或每个字符串。
你们如何渲染文字? 这是渲染它的好方法吗? 如果是的话,是否有任何已经存在的lib?
答案 0 :(得分:4)
使用“spritesheet like”纹理渲染文本,每个字母都可以使用,这是一种非常常见的方式。
虽然不知道有任何库来渲染这样的文本(我确定有),但实际上不应该自己编写代码。如果你想编写自己的代码来做,你需要一些方法来生成一个包含你需要的每个字母的纹理。 BMFont是一个可以生成此类纹理的程序。此外,BMFont会生成一个附带的“.fnt”文件,指示每个字母在纹理中的位置。
以下是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
...
答案 1 :(得分:0)
使用FreeType动态生成字形位图,并使用box packing的your choice算法将其填充到一个(或多个)大纹理中。
正如你所说,大多数字符串只需要一个,也许两个纹理绑定。
答案 2 :(得分:0)
这里的another one可以构建紧凑的字体位图,可选择包括字距调整,并包含加载和显示字体的源代码