我有一个字符串,例如“Hello world”和一个字体名称,例如“Courier”。我需要得到一个代表这个字符串的折线数组。这些折线将在 OpenGL 场景中渲染。
我的意思是我需要将每个字母转换成一条或多条二维折线。
如何在 iOS 中执行此操作(Objective-C 或 C++)
我有一个字符串,例如“Hello world”和一个字体名称,例如“Courier”。我需要得到一个代表这个字符串的折线数组。这些折线将在 OpenGL 场景中渲染。
我的意思是我需要将每个字母转换成一条或多条二维折线。
如何在 iOS 中执行此操作(Objective-C 或 C++)
您可以使用 Core Text 从文本和字体中获取路径。有一个名为 Core Text 的方法CTFontCreatePathForGlyph
,它将为您提供给定符号的给定字形的路径。使用它,您可以获得所有字形的路径。
你应该看看这篇关于“低级文本渲染”的文章。您还可以查看本文的示例代码,了解如何获取文本的路径(并使用 Core Animation 对其进行描边)。
您仍然需要将路径转换为折线(因为路径可能包含圆弧和曲线,而折线只是点列表)
FreeType 库支持加载各种字体文件(TrueType、PostScript 等)。FreeType 引擎可以加载字体并渲染到位图,但它也可以返回详细的字形信息。
您可以使用该FT_Outline_Decompose
函数获取一个FT_Outline
并将其分解为其组成的线、弧和曲线。您只需在一个结构中提供一系列函数指针,这些指针FT_Outline_Funcs
将在大纲处理期间调用。这些函数由您定义,因此您可以简单地将它们转换为最适合您的应用程序的任何格式(例如折线)。
API参考:
请注意,如果您正在渲染不经常更改的大块文本,则在每一帧渲染和填充一系列曲线非常昂贵。通常的解决方案是选择一个点大小,将所有需要的字形渲染成一个纹理,然后使用纹理图集将字符串渲染成一个四边形。
一些有用的信息发布在关于字体的 OpenGL 常见问题解答之一中,尽管它们也谈到了使用 FreeType。纹理图集技术值得一读: