11

背景

我在游戏Bitfighter工作。我们仍然与 OpenGL 1.1 兼容,并针对 OSX、Windows 和 Linux 进行编译。

我们对一切都使用矢量图形,包括文本渲染和操作。我们使用 GLUT 的“FontStrokeRoman”稍作修改的变体,它只是一堆静态线条。我们喜欢这个,因为它似乎表现得非常好,易于旋转/缩放/操作。我们还允许在游戏中聊天,以便即时绘制文本。

问题

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

我们发现了其他几种我们喜欢的字体,但它们都是 TTF 类型的字体,它们构建为多边形(带有曲线等),而不是笔触或脊椎。这带来了几个问题:

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

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

我们甚至尝试使用诸如“campskeleton”之类的库对多边形字体进行骨架化,因此我们可以输出矢量笔划字体(看起来不太成功)。

我们应该做什么?

我知道这个问题有点笼统。我们希望保持性能和文本操作能力,但能够使用更好的字体。我愿意接受任何方向的任何建议。

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

  • 我们如何正确地消除基于多边形的文本的锯齿并且仍然保持性能?
  • 纹理的性能真的比静态点数组差吗?也许我有一个错误的假设
  • 纹理字体可以快速调整大小/旋转吗?
  • 完全不同的东西?
4

3 回答 3

4

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

使用stb_truetype的字体存储

这似乎非常适合我们的游戏。渲染性能与我们使用的基于矢量的笔触字体相当 - 纹理四边形真的不是那么慢,一旦生成,Font-Stash 的缓存有很大帮助。此外,使用 stb_truetype 使我们不需要跨所有平台的游戏中的另一个依赖项。

就其价值而言,这个解决方案比使用 FTGL 处理真字体快大约一个数量级,这可能是因为缓存。

感谢您的建议和指点。

更新

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

于 2013-03-30T15:34:54.203 回答
2

我不是 OpenGL 专家,也不是一般的图形专家。而且,真的,猛禽,我——讨厌——成为这样说的人,因为我知道你现在的感受。

我真的不想这么说,但老实说,我只是给 TTF 字体一个机会,使用它们的纹理和多边形。我怀疑这种用法是否真的会损害你这些天的表现。节省时间按原样使用它们可能更有价值,而不是花时间尝试一些更符合您需求的聪明解决方案。

我怀疑使用多边形/纹理绘制文本会对您的性能产​​生不利影响。这尤其适用于当今的计算机。多少年前,从技术上讲,您打算支持您的应用程序?或者您也希望在 Raspberry PI 上运行它?还是其他不具备高图形能力的移动平台?对其中任何一个的支持可能会使我的主张无效。

但是,就像我说的那样,我真的很讨厌成为那个建议你按原样艰难前行的人。因为,我去过那里,寻求性能建议(有时甚至是更小的事情),当有人说“忘记它,编译器会处理它”或“计算机如此先进,你不应该担心它”时,我只是呻吟着. 老实说,我希望其他人有经验,并为您提供一个好的答案。但是,如果不是,我只想让您知道:我无法预见使用 TTF 的可能性,如预期的那样,会对您的游戏性能产生任何不利影响。

于 2013-03-21T18:01:34.840 回答
1

您是否尝试使用 freetype FT_Outline_Decompose进行轮廓字形分解 ?Freetype 是字体渲染和字形轮廓提取的首选工具。支持提示,渲染模式允许您指定您想要的抗锯齿、提示、单色目标等。

Freetype 还具有内置的字形/位图缓存机制,这可能很有用。

注意:OGFLT似乎弥合了 freetype 和 opengl 之间的差距,尽管我从来没有机会使用它

于 2013-03-21T18:41:33.900 回答