c++ - OpenGL 文本渲染方法和权衡

标签 c++ performance opengl fonts

背景

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

我们将 vector 图形用于一切,包括文本渲染和操作。我们使用来自 GLUT 的“FontStrokeRoman”的稍微修改的变体,它只是一堆静态线。我们喜欢它,因为它看起来表现非常好,易于旋转/缩放/操纵。我们还允许进行游戏内聊天,以便即时绘制文本。

问题

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

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

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

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

我们甚至尝试使用像“campskeleton”这样的库对多边形字体进行骨架化,这样我们就可以输出 vector 笔划字体(但效果不佳,看起来不错)。

我们应该做什么?

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

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

  • 我们如何正确消除基于多边形的文本的锯齿并保持性能?
  • 纹理真的比静态点阵列表现更差吗?也许我有一个错误的假设
  • 带纹理的字体能否快速调整大小/旋转?
  • 完全不同的东西?

最佳答案

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

Font-Stash使用 stb_truetype

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

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

感谢您的建议和指点。

更新

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

关于c++ - OpenGL 文本渲染方法和权衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15554485/

相关文章:

c++ - 如何使用 testBit 函数检查二进制数组中的特定索引位

c++ - 如何将模式规则应用于多个目录?

结合两个非常快的查询时MySQL慢查询

opengl - 实现扫射 - Opengl - 相机

c++ - 我如何使用 C++ 中的代码从字面上打开文件

c++ - 使用 boost singleton_pool 的自定义分配比默认慢

c - 我如何证明缓存未命中?

java - 当找到多个集合的交集时,使用retainAll()的最快顺序

c++ - 自定义 glBlendFunc 比原生慢很多

opengl - 非索引渲染中的 gl_VertexID