将truetype字形转换为OpenGL多边形

aro*_*tie 13 c++ windows opengl truetype

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

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

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

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

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

Tim*_*Tim 2

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

  1. 忽略绕线顺序
  2. 将所有字形绘制到模板缓冲区中,每次绘制片段时将模板值递增 1。
  3. 在场景上绘制一个四边形,填充模板缓冲区 == 1 的任何像素。

我的想法是,字形未覆盖的任何区域将具有模板值 == 0,字形内的任何区域将具有模板值 == 1,字形内的任何孔将具有模板值 == 2 (因为它们被原始字形和“洞”覆盖)。然后,您可以按此过滤以仅绘制模板等于 1 的区域。