背景
我在玩游戏 Bitfighter .我们仍然与 OpenGL 1.1 兼容,并为 OSX、Windows 和 Linux 编译。
我们将 vector 图形用于一切,包括文本渲染和操作。我们使用来自 GLUT 的“FontStrokeRoman”的稍微修改的变体,它只是一堆静态线。我们喜欢它,因为它看起来表现非常好,易于旋转/缩放/操纵。我们还允许进行游戏内聊天,以便即时绘制文本。
问题
我们想使用更多/不同的字体。
我们发现了其他几种我们喜欢的字体,但它们都是 TTF 类型的字体,构建为多边形(带有曲线等),而不是笔划或脊柱。这带来了一些问题:
- 我们必须使用纹理(我们在游戏中一直避免使用)
- 它们不容易调整大小/旋转等。
- 性能显着降低(理论上?)
我们已经尝试将 TTF 字体转换为多边形点数组,然后对填充进行三角测量。然而,这很难很好地呈现 - 像素提示/抗锯齿在这种情况下似乎很难做到。
我们甚至尝试使用像“campskeleton”这样的库对多边形字体进行骨架化,这样我们就可以输出 vector 笔划字体(但效果不佳,看起来不错)。
我们应该做什么?
我知道这个问题有些笼统。我们希望保持性能和文本操作能力,但能够使用更好的字体。我愿意接受任何方向的任何建议。
一些解决方案可能是以下问题的答案:
- 我们如何正确消除基于多边形的文本的锯齿并保持性能?
- 纹理真的比静态点阵列表现更差吗?也许我有一个错误的假设
- 带纹理的字体能否快速调整大小/旋转?
- 完全不同的东西?
最佳答案
经过一些说服(感谢 Serge)并尝试了这里的一些建议(包括使用 freetype 的 FTGL),我们决定:
这似乎非常适合我们的游戏。渲染性能与我们使用的基于 vector 的笔划字体相当——纹理四边形确实不是那么慢,一旦生成,来自 Font-Stash 的缓存有很大帮助。此外,stb_truetype 的使用让我们在所有平台的游戏中都不需要另一个依赖项。
就其值(value)而言,此解决方案比使用 FTGL 处理真型字体快大约一个数量级,这可能是因为缓存。
感谢您的建议和指点。
更新
上面的 Font-Stash 链接是 original here 的一个分支.原来的已经更新,添加了一些 fork 的功能,并且可以允许不同的渲染后端。
关于c++ - OpenGL 文本渲染方法和权衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15554485/