在OpenGL中渲染文本的首选方法


17

我将再次为大学项目准备计算机图形学。在以前的项目中,我使用了一个名为FTGL的库,它感觉很沉重(我尝试了很多渲染技术,但是文本渲染的伸缩性不是很好),对此我并不满意。

我的问题是,是否有一个良好且高效的库?如果不是,那么实现快速但美观的文本的方式将是什么?一些预期用途是:

  • 浮动对象/字符标签
  • 对话对话
  • 选单
  • 平视显示器

编辑:最好也可以加载字体


1
这是“使用哪种技术的问题”,因此可能应该关闭。
Laurent Couvidou

Answers:


4

流行的框架是Crazy Eddie的GUI

但是尽管这很吸引人,但您自己推出自己的应用程序并不罕见(也许随着范围的扩大而后悔;)

将字形显示在位图上,然后使用OpenGL绘制位图是正常的。

有时,您显示的过渡文本可能只在少数框架中显示。仅使用GL_QUADS + glVertex就足够了。但是对于大量文本或长时间可见性,将GL_QUADS放入VBO中是非常值得的-我已经注意到,这样做可以大大提高性能。

当然,存在生成所需字形的问题。您可以使用像bmfont这样的程序。或者,您可能需要更复杂的渲染,例如,按需自由字体。我一直很高兴地将bmfont与我自己的渲染器一起使用,这非常容易推断。


9

有很多方法-取决于您想要的...与其他地方一样,没有“最佳解决方案”之类的东西。您的目标平台是什么?您使用哪种语言?关于文本大小调整/旋转是什么-有必要吗?您是否需要能够渲染TrueTypeFonts?关于多语言/ Unicode呢?您想如何存储文本(哪种编码等)?

我过去也使用过FTGL,以及纯的freetype(http://www.freetype.org/ FTGL都基于此),不同类型的位图字体,轮廓字体...现在,我最沉迷于位图字体,但这仅是我个人的喜好。因为我不想处理不同的字符集,编码和类似的东西了-而且位图字体的许可也比TrueTypeFonts更容易和更便宜。并且它可在可加载图像的每个平台上使用。我在openGL中仅使用一个四边形,并在其上映射我的纹理的一部分。另一面是:字体将只能以大约+/- 50%的比例重新调整大小。如果可以,我建议使用位图字体。

如果您还必须处理不同的编码/字符集,则应该找到一种加载和使用TrueTypeFonts的方法(例如与freetype,使用另一个库或您自己的实现一样)...

还可以查看有关此主题的不同教程:

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=13位图字体

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=14轮廓字体

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=15纹理映射轮廓字体

http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=17 2D纹理字体

祝好运!


+1感谢您提供有关性能的宝贵信息,我确实了解NeHe的教程。我想我确实使用了位图字体...但是它没有缩放:大约60个标签漂浮在由线连接的球体上方的场景中,对此有何见解?(我当时想我应该寻找一种实现轻量级模式的方法)
dukeofgaming 2011年

1
注意:NeHe的教程适用于旧的固定功能管道,并且不经常更新。如果您正在寻找现代的OpenGL解决方案,请参见stackoverflow.com/questions/5262951/…–
brita_

6

如果您想使用位图字体,那么使用Angelcode位图字体生成器就不会出错:http ://www.angelcode.com/products/bmfont/

它将一个truetype字体转换为一个或多个纹理(带有很好包装的字形),并输出一个包含UV和间距的小文件(我发现XML输出特别容易使用,并且间距数据的质量通常是很好,即使没有真正的字距调整)



0

考虑QML。这是一个功能齐全的UI库,具有易于使用的语法。在我的经验中,它的功能集明显优于CEGUI,并且它的文档,支持和社区功能更好,因为它的主要目标是桌面应用程序,并且能够在屏幕外进行渲染只是一种奖励。

优点:

  • 它在后端使用OpenGL进行所有渲染
  • 它可以加载主机系统可用的任何字体,还可以解析作为资源包含的其他字体
  • 它使用带符号的距离场文本渲染来实现高效和高质量的输出
  • 它可以直接渲染为OpenGL纹理,因此您可以轻松地将结果放置在游戏环境中
  • Qt有很多语言绑定

缺点:

  • Qt是一个大框架
  • 在Direct3D或Vulkan项目中使用QML需要跳过箍以使GL纹理进入适当的API(或等待有人为QML编写本机D3D / Vulkan渲染器)
  • QML中仍然存在一些小问题,即使您要渲染到屏幕外表面,QML也会尝试使用本机控件,例如尝试打开列表项的下拉菜单时。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.