关于 OpenGL 字体渲染有很多问题,其中许多问题都可以通过纹理图集(快速,但错误)或字符串纹理(仅限固定文本)来解决。
但是,这些方法很差,并且似乎已经过时了(使用着色器来更好/更快地做到这一点呢?)。对于 OpenGL 4.1,有一个很好的问题是关于“你今天应该使用什么?”:
从 4.1 版开始,OpenGL 中文本渲染的最新技术是什么?
那么,我们今天应该在 iOS GL ES 2 上使用什么?
我很失望似乎没有开源(甚至商业解决方案)。我知道很多团队都把它搞砸了,花费数周的开发时间重新发明这个轮子,逐渐学习如何调整字距和空间等(呃)——但肯定有比重写整个“字体”更好的方法从头开始?
据我所知,这有两个部分:
- 我们如何使用字体渲染文本?
- 我们如何显示输出?
对于 1(如何渲染),Apple 提供了许多方法来获得“正确”的渲染输出 - 但“简单”的不支持 OpenGL(也许其他一些支持 - 例如,是否有一种简单的方法来映射 CoreText 输出到OpenGL?)。
对于 2(如何显示),我们有着色器、VBO、字形纹理、查找纹理和其他技术(例如上面链接的 OpenGL 4.1 东西?)
以下是我所知道的两种常见的 OpenGL 方法:
- 纹理图集(渲染所有字形一次,然后从共享纹理中为每个字符渲染 1 x 纹理四边形)
- 这是错误的,除非您使用的是 1980 年代的“位图字体”(即便如此:纹理图集需要比看起来更多的工作,如果您需要它对非平凡字体正确)
- (字体不是“字形的集合”,有大量的定位、布局、环绕、间距、字距调整、样式、着色、加权等。纹理图集失败)
- 固定字符串(使用任何 Apple 类正确渲染,然后截取背景图像数据,并作为纹理上传)
- 在人类方面,这很快。在帧渲染中,这非常非常慢。如果您使用大量更改的文本执行此操作,则您的帧速率会下降
- 从技术上讲,它大部分是正确的(不完全正确:您以这种方式丢失了一些信息)但效率极低
我也见过,但听说过的好事和坏事:
- Imagination/PowerVR“Print3D”(链接断开)(来自制造 GPU 的人!但他们的网站已经移动/删除了文本渲染页面)
- FreeType(需要预处理、解释、大量代码、额外库?)
- ...和/或 FTGL http://sourceforge.net/projects/ftgl/(谣言:慢?有问题?很久没有更新了?)
- 字体存储http://digestingduck.blogspot.co.uk/2009/08/font-stash.html(高质量,但很慢?) 1.
在 Apple 自己的操作系统/标准库中,我知道文本渲染的几个来源。注意:我已经在 2D 渲染项目中详细使用了其中的大部分,我关于它们输出不同渲染的陈述是基于直接经验
- 带有 NSString 的 CoreGraphics
- 最简单的:渲染“成 CGRect”
- 似乎是人们推荐的“固定字符串”方法的一个稍快的版本(即使你希望它大致相同)
- 带有纯文本的 UILabel 和 UITextArea
- 注意:它们不一样!它们呈现 smae 文本的方式略有不同
- NSAttributedString,呈现为上述之一
- 再次:呈现方式不同(我所知道的差异相当微妙,被归类为“错误”,关于此的各种 SO 问题)
- CATextLayer
- iOS 字体和旧 C 渲染的混合体。使用“不完全”的免费桥接 CFFont / UIFont,它揭示了更多的渲染差异/陌生感
- 核心文本
- ...最终的解决方案?而是自己的野兽……