将truetype字形转换为OpenGL多边形

时间:2012-09-05 13:17:24

标签: c++ windows opengl true-type-fonts

我正在尝试为任何已安装的truetype字体创建一个转换库,将其转换为一系列可用于在OpenGL中显示文本的多边形。我使用GetGlyphOutline函数将字形转换为一系列轮廓,然后使用glu库对这些轮廓进行三角测量(tesselate)。

它通常有效,但并不总是有奇怪的例外。 GetGlyphOutline应该首先以CW缠绕顺序返回外轮廓,并以CCW缠绕顺序返回内轮廓(孔)。根据字体和字形,遗憾的是情况并非如此。有时外轮廓处于CCW缠绕顺序且孔处于CW状态,或者虽然缠绕顺序正确,但GetGlyphOutline返回的轮廓顺序是错误的(例如,我首先获得'孔',然后是外轮廓)。

我试图调整转换以检查这些奇怪的情况,如果有必要,反转轮廓的顶点和缠绕顺序,但似乎没有规则,如果一个带有1或2个孔的字符可以用几个字体,我总是发现一个例外。例如。使用名为MinionPro-BoldCn的字体,即使GetGlyphOutline错误地返回数字'8'的字形,我最终只有一个洞而不是两个洞。

我还尝试使用其他方法而不是GetGlyphOutline。我使用GDI将文本渲染到路径中,然后使用GetPath函数获取该路径的轮廓。结果是一样的。 GetPath使用错误的轮廓顺序和/或错误的缠绕返回某些字符。

有没有人有这方面的经验,有什么我可以做的吗?

2 个答案:

答案 0 :(得分:1)

也许不是一个完美的解决方法,但有一个想法(没有想到任何反例):

  1. 忽略上弦顺序
  2. 将所有字形绘制到模板缓冲区中,每次绘制片段时将模板值递增1.
  3. 在场景上绘制四边形,填充模板缓冲区== 1的任何像素。
  4. 我的想法是,字形未覆盖的任何区域都将具有模板值== 0,字形内的任何区域都将具有模板值== 1,并且字形内的任何孔都将具有模板值== 2 (因为它们被原始的字形和“洞”覆盖)。然后,您可以通过此过滤仅绘制模板等于1的区域。

答案 1 :(得分:0)

我已经找到了一条规则来确定轮廓是否划分了字形的外部或内部区域。 对于内轮廓中的每个边缘,必须存在至少一个点,使得三角形处于顺时针缠绕顺序。 对于外轮廓中的边缘,必须没有点使得三角形处于顺时针缠绕顺序。 请参阅TrueType fundamentals中的“大纲”部分。