65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 OpenGL 渲染 FreeType/2

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.43/5 (5投票s)

2006年3月3日

CPOL

3分钟阅读

viewsIcon

93579

downloadIcon

2051

一篇关于渲染 FreeType 的文章

Sample Image - freetype.jpg

引言

本文将解释如何通过封装 FreeType 库将 TrueType 文本渲染到 OpenGL 表面;使用开源工具和技术;这些包括 Mono、SDL、TAO 和 FreeType/2 软件包。

背景

当开始使用 3D 图形时,您想完成的第一件事之一就是能够渲染 TrueType 文本;这并不像听起来那么容易……在 3D 空间中,您需要为字体中的每个字符创建一组四边形;四边形定义了每个字符在 TrueType 字体中的笔画或轮廓。 在 Windows 平台上,函数 wglUseFontOutlines 被绑定到设备上下文;这很好,但在 Linux 上没有 wglUseFontOutlines 或设备上下文之类的东西;所有 TrueType 文本渲染都由一个名为 FreeType 的库管理。

经过多天的网络浏览,我最终得出结论,在 .NET 平台上不存在一个像样的 FreeType 封装器;很多人让我发布代码,所以我决定把它放在这里。

Using the Code

您需要在 Linux 上安装以下软件包

  • Mono & Mono-Develop
  • Tao-Framework .NET
  • SDL.NET
  • FreeType/2

如果您的 /etc/mono/config 文件中还没有类似下面这样的一行,请确保有;有关更多信息,请参阅 mono 文档。

 <dllmap dll="opengl32.dll" target="libGL.so">
 <dllmap dll="freetype.dll" target="libfreetype.so">

我们的 FreeTypeWrap 命名空间定义了原生 FreeType API 的封装器;在其中,我们定义了一组类;它们是使用 sequential 属性定义的;这样它们在内存中出现的顺序与我们在代码中定义它们的顺序相同;默认情况下,.NET 运行时有时会打乱类成员的顺序,以便优化内存使用;当涉及到编组原生代码时,这绝对不是您想要的。 有些类成员包含 static 方法,这些方法是上下文相关的,因此在使用它时更容易阅读和理解。

值得一提的是,这个封装器是 FreeType 本身的本地封装器,并没有封装自定义构建库(如 SDL 的情况);它基本上直接融入了 FreeType ,而不是一个自定义构建库;我使用的版本是 9.8.3 (freetype-config --version)。

 [StructLayout (LayoutKind.Sequential)]
 public class Library {
 public System.IntPtr memory;
 ...

我们主要使用 System.IntPtr 进行内存指针;如果 FreeType 分配内存,则会通过一个 out 运算符传递它,该运算符告诉 .NET 运行时,内存不是我们进程的一部分,而是属于外部进程;我们只有一个指向它的指针(它是 void* 的 C# 版本)。

 [DllImport ("freetype.dll")]
 public static extern int FT_Init_FreeType( out System.IntPtr lib );

请注意,我们的 FreeTypeWrap 命名空间仅定义了我们需要将 TrueType 文本渲染到 OpenGL 表面所需的类;它远不是整个 FreeType API 的完整表示;这是巨大的;但请记住,它可以很容易地扩展以支持遵循相同基本原则的整个 API。

Font3D 是发生大部分有趣事情的地方;它是一个实用程序类,可以实例化,因此您可以一次创建多个字体;构造函数接受要从中加载的字体文件的名称和通用点大小。 从这里开始,它会创建一个 3D 纹理和字体中前 128 个字符的四边形集合。

我们的 print 方法会将文本打印到当前的 OpenGL 表面,它这样做不会扰乱当前的模型和视图矩阵设置。

extent 方法用于计算特定文本字符串的距离;当您需要居中对齐文本时,这很好用。

示例应用程序将在屏幕上旋转一些文本,它依赖于 SDL 进行事件和视频处理,并使用 TAO.Gl 进行渲染。

我希望这能帮助到某人。

历史

  • 2006 年 3 月 3 日:首次发布

© . All rights reserved.