在OpenGL字体渲染方面,有许多问题,其中许多问题可以通过纹理图集(快速但错误)或字符串纹理(仅限固定文本)来解决。
然而,这些方法很差,并且似乎已经过时数年了(使用着色器是否可以更好/更快地完成?)。对于OpenGL 4.1,有一个非常好的问题,看一下“今天应该使用什么?”: OpenGL中文网-OpenGL 4.1的文本渲染现状 那么,在iOS GL ES 2上,我们今天应该使用什么呢?
我很失望,似乎没有开源(甚至商业)的解决方案。我知道很多团队会花费几周的时间重新发明这个轮子,逐渐学习如何调整和间隔等等(呃)-但一定有比从头开始重写“字体”更好的方法吧?
据我所见,这个问题可以分为两部分:
对于第二部分(如何显示),我们有着色器、VBOs、字形纹理、查找纹理和其他技术(例如上面链接的OpenGL 4.1?)。
以下是我所知道的两种常见的OpenGL方法:
然而,这些方法很差,并且似乎已经过时数年了(使用着色器是否可以更好/更快地完成?)。对于OpenGL 4.1,有一个非常好的问题,看一下“今天应该使用什么?”: OpenGL中文网-OpenGL 4.1的文本渲染现状 那么,在iOS GL ES 2上,我们今天应该使用什么呢?
我很失望,似乎没有开源(甚至商业)的解决方案。我知道很多团队会花费几周的时间重新发明这个轮子,逐渐学习如何调整和间隔等等(呃)-但一定有比从头开始重写“字体”更好的方法吧?
据我所见,这个问题可以分为两部分:
- 如何使用字体来呈现文本?
- 如何显示输出结果?
对于第二部分(如何显示),我们有着色器、VBOs、字形纹理、查找纹理和其他技术(例如上面链接的OpenGL 4.1?)。
以下是我所知道的两种常见的OpenGL方法:
- 纹理集(仅渲染一次所有字形,然后从共享纹理中为每个字符渲染1个带纹理的矩形)
- 这是错误的,除非您使用的是1980年代的“位图字体”(即使是这样:纹理集需要更多的工作量,如果您需要对非常规字体进行正确处理)
- (字体不仅仅是“一组字形”,还涉及大量的定位、布局、换行、间距、字距、样式、着色、加权等。纹理集会失败)
- 固定字符串(使用任何苹果类进行正确渲染,然后截取背景图像数据并上传为纹理)
- 从人类的角度来看,这很快。但在帧渲染方面则非常缓慢,如果您使用大量变化的文本来做这件事,则帧率会急剧下降。
- 技术上,这基本上是正确的(不完全正确:这样您会失去一些信息),但效率极低。
我也看到过有关这两种方法的好的和坏的反馈:
- Imagination/PowerVR "Print3D"(链接失效)(来自制造GPU的公司!但他们的网站已经移动/删除了文本渲染页面)
- FreeType(需要预处理、解释、很多代码和额外的库?)
- ...和/或FTGLhttp://sourceforge.net/projects/ftgl/ (传言:慢?有漏洞?很长时间没有更新?)
- Font-Stash http://digestingduck.blogspot.co.uk/2009/08/font-stash.html(高质量,但非常缓慢?)
在苹果自己的操作系统/标准库中,我知道几个文本渲染来源。注意:我在2D渲染项目中详细使用了它们中的大部分,我的关于它们输出不同渲染的陈述基于直接经验
- 使用NSString和CoreGraphics
- 最简单的方式:在CGRect中渲染
- 似乎比人们推荐的“固定字符串”方法稍微快一些(尽管你可能认为它们应该大致相同)
- 使用纯文本的UILabel和UITextArea
- 注意:它们不是完全相同的!在呈现相同文本方面有细微差异
- NSAttributedString,呈现为上述之一
- 再次强调:呈现方式不同(我知道的差异相当微小,被归类为“错误”,有关此问题的各种SO问题)
- CATextLayer
- iOS字体和旧版C渲染之间的混合。使用“未完全”桥接的CFFont / UIFont,这将显示出一些更多的渲染差异/奇怪之处
- CoreText
- ......最终解决方案?但是它有自己的难点......