使用 OpenGL 渲染 FreeType/2
一篇关于渲染 FreeType 的文章

引言
本文将解释如何通过封装 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 日:首次发布