OpenGL文本渲染方法和权衡

时间:2013-03-21 17:42:16

标签: c++ performance opengl fonts

背景

我参与游戏Bitfighter。我们仍然与OpenGL 1.1兼容并为OSX,Windows和Linux编译。

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

问题

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

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

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

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

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

我们该怎么做?

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

有些解决方案可以解决以下问题:

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

3 个答案:

答案 0 :(得分:4)

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

使用Font-Stash

stb_truetype

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

对于它的价值,这个解决方案比使用FTGL对真实字体大约快一个数量级,可能是因为缓存。

感谢您的建议和指示。

<强>更新

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

答案 1 :(得分:2)

我不是OpenGL专家,也不是图形专家。 而且,真的,Raptor,I -hate-成为这样说的人,因为我知道你现在的感受。

我真的很讨厌这么说,但老实说,我只是按照他们的意图使用他们的纹理和多边形来拍摄TTF字体。我怀疑这样的用法如今会对你的表现产生真正的不利影响。节省使用它们的时间可能更有价值,而不是花时间尝试一些更符合您需求的聪明解决方案。

我怀疑使用多边形/纹理的文字绘图对你的表现是不利的。这尤其适用于今天的计算机。多少年前,从技术上讲,您打算如何支持您的应用程序?或者您也希望在Raspberry PI上运行它?还是其他没有高图形功能的移动平台?支持这些可能会使我的主张无效。

但是,就像我说的那样,我真的很想成为那个暗示你向前跋涉的家伙。因为,我一直在那里,要求提供性能建议(有时甚至是更小的东西),当有人说“忘记它,编译器将处理它”或“计算机是如此先进,你不应该担心它”时,只是呻吟。老实说,我希望有其他人有经验,并为你提供一个好的答案。但是,如果没有,我只是想让你知道:我无法预见使用TTF的可能性会对你的游戏性能产生任何不利影响。

答案 2 :(得分:1)

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

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

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