OpenGL文本渲染方法和权衡

rap*_*tor 11 c++ opengl performance fonts

背景

我在游戏Bitfighter上工作.我们仍然与OpenGL 1.1兼容并为OSX,Windows和Linux编译.

我们使用矢量图形来处理所有事情,包括文本渲染和操作.我们使用GLUT中稍微修改过的'FontStrokeRoman'变体,它只是一堆静态线.我们喜欢这个,因为它似乎表现得非常好,易于旋转/缩放/操纵.我们还允许进行游戏内聊天,以便即时绘制文本.

问题

我们想要使用更多/不同的字体.

我们已经找到了我们喜欢的其他几种字体,但它们都是TTF类型的字体,它们构建为多边形(带曲线等)而不是笔画或刺.这带来了一些问题:

  • 我们必须使用纹理(我们在游戏中到目前为止已经避免了)
  • 它们不容易调整大小/可旋转/等.
  • 性能显着降低(理论上?)

我们已经尝试将TTF字体转换为多边形点阵列,然后对填充进行三角测量.然而,这很难很好地渲染 - 在这种情况下,像素提示/抗锯齿似乎很难做到.

我们甚至尝试使用像'campskeleton'这样的库对多边形字体进行镂空,因此我们可以输出矢量笔划字体(看起来不太成功).

我们应该做什么?

我知道这个问题有点笼统.我们希望保持性能和文本操作能力,但能够使用更好的字体.我对任何方向的任何建议持开放态度.

一些解决方案可能是以下答案:

  • 我们如何正确地对基于多边形的文本进行反别法并保持性能?
  • 纹理真的比静态点阵列更差吗?也许我有一个错误的假设
  • 纹理字体可以快速调整大小/旋转吗?
  • 完全不同的东西?

rap*_*tor 4

经过一些令人信服的(感谢 Serge)并尝试了这里的一些建议(包括使用 freetype 的 FTGL),我们决定:

使用stb_truetype的Font-Stash

这对于我们的游戏来说似乎是完美的。渲染性能与我们使用的基于矢量的笔划字体相当 - 一旦生成,纹理四边形实际上并没有那么慢,并且 Font-Stash 的缓存有很大帮助。此外,stb_truetype 的使用使我们无需在所有平台的游戏中需要其他依赖项。

就其价值而言,该解决方案比使用 FTGL 处理 true-type 字体大约快一个数量级,可能是因为缓存的缘故。

感谢您的建议和指点。

更新

上面的 Font-Stash 链接是原始链接的一个分支。原版已经更新,添加了一些分叉的功能,并且可以允许不同的渲染后端。