【发布时间】:2011-01-05 12:14:35
【问题描述】:
我正在实现基于 OpenGL 构建的 GUI。我遇到了每个 GUI 都会遇到的问题——文本渲染。我知道在 OpenGL 中呈现文本的几种方法,但是,我想知道哪种方法最适合 GUI。
通常在 GUI 中,我们有两种类型的文本——静态的和实时的。静态很容易——我们可以将一个 TTF 渲染到一个纹理上然后忘记它。更让我困扰的是“实时”文本——想象一下控制台,或者多人游戏中的实时聊天。
我想到了几个选项:
- 没有特殊情况 - 每次文本更改时渲染和加载纹理,请记住仅在实际出现新文本时重新渲染它,并尝试将较大的文本分成小部分(如每个聊天行)。但是,这仍然会让我们陷入困境,例如分数线一直在变化,或者介绍性文字呈现“每个字符”(某些科幻游戏中的打字机风格)
- quad-per character -- 这似乎也是一个流行的解决方案,您使用 ASCII 表准备纹理并渲染纹理四边形字符。但是,我严重怀疑这种解决方案的效率。我们也欢迎提供如何加快速度的提示。
- 混合解决方案 -- 但是我不知道如何干净地实现它
因此问题是——如何在 OpenGL 中有效地渲染文本?
如果这有帮助,我正在使用 STL/Boost-heavy C++ 进行编码,并针对 GForce 6 及更高版本的显卡。
【问题讨论】:
-
不要构建带有所有可能字形的大纹理。虽然对于西方字体来说它简单且“明智”,但如果您尝试将您的应用程序国际化,您很快就会意识到这种方法对于东方字体是不可持续的。唯一可扩展的解决方案是在需要时生成动态文本。
-
如果您尝试自己渲染单个字形,您将忽略操作系统所知道的关于字距调整、重音符号和组合字符、从右到左的脚本以及其他一些类型布局的怪癖我现在忘记了。使用带有标点符号的 0-9a-zA-Z 文本表可能可以涵盖一些非常常见的情况,但大多数情况下,当您向字体渲染器询问整行或整段时,您会得到更漂亮的类型。
标签: performance opengl text-rendering