【问题标题】:Converting truetype glyphs to OpenGL polygons将 truetype 字形转换为 OpenGL 多边形
【发布时间】:2012-08-30 05:26:28
【问题描述】:

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

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

我尝试调整转换以检查这些奇怪的情况,如有必要,颠倒轮廓的顶点和缠绕顺序,但似乎没有规则,如果一个有 1 或 2 个孔的字符使用几种字体就可以了,我总能找到一个例外。例如。使用名为 MinionPro-BoldCn 的字体,即使是数字“8”的字形也由 GetGlyphOutline 返回错误,我最终只得到一个孔而不是两个。

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

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

【问题讨论】:

  • 您可能会假设最外面的区域是“空的”,然后在填充和不填充封闭区域之间交替。不过,这将分解为自相交的形状。
  • 可能你的想法大部分时间都行得通,我自己也有一些类似的想法,但并非一直如此。出于某种原因,当我将字符(TextOut)作为路径的一部分绘制时,然后使用 GetPath 读回此路径,以防某些字体轮廓正确返回(即外部首先使用 cw 缠绕,然后内部使用 ccw 缠绕) ,但对于其他字体,轮廓返回的顺序没有特定的顺序,并且它们的缠绕可能是错误的。
  • 绕组对我的建议没有任何影响。为什么它不起作用?
  • 因为你不能确定哪些轮廓形成了字形的哪些部分。如果一个较小的轮廓完全在一个较大的轮廓之内而不是一个洞,但是有一些外来语言的轮廓可以重叠,并且一个字形中有多个外轮廓。
  • 这是一个老话题,但我想知道如何解决这个问题。我正在为我的 OpenGL 游戏考虑类似的方法。我什么都没做,但在我看来,解析 TTF 或 OTF 比 GetGlyphOutline() 更好。如果您在线,请给我回电!

标签: c++ windows opengl truetype


【解决方案1】:

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

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

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

【讨论】:

  • 对不起,这在我的情况下不起作用。我需要多边形(三角形)从字形创建 3D 对象。
【解决方案2】:

我想出了一个规则来确定轮廓是划定字形的外部区域还是内部区域。 对于内轮廓中的每条边,必须至少有一个点使得三角形按顺时针缠绕顺序。 对于外轮廓中的边,必须没有点使得三角形按顺时针缠绕顺序。 请参阅TrueType fundamentals 中的大纲部分。

【讨论】:

猜你喜欢
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多