c++ - 将 truetype 字形转换为 OpenGL 多边形

标签 c++ windows opengl truetype

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

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

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

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

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

最佳答案

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

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

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

关于c++ - 将 truetype 字形转换为 OpenGL 多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12282349/

相关文章:

c++ - 显示列表、OpenGL、C++ 中的 "R6025 - pure virtual call"

c++ - 如何根据 Valgrind 输出进一步调试

c++ - C++11 是否要求分配器是默认可构造的,libstdc++ 和 libc++ 不同意?

c++ - 确保一个小部件有一个容器?

c++ - 使用 C++ 清除屏幕

windows - 在 Windows 上的 Perl 中获取当前系统本地编码

java - 矩阵在 openGL 中不起作用

opengl - 如何仅剪切剪切平面的交集(而不是并集)?

windows - 在 Windows CMD 上递归删除文件或文件夹

c++ - 在经典 C++ WinAPI (Win32) 应用程序中获取 Windows 10 主题颜色