OpenGL中的多语言Unicode渲染

8

我需要扩展一个OpenGL渲染系统以支持国际字符(特别是希伯来文、阿拉伯文和西里尔文)。

开发平台是Windows(XP | Vista | 7),但遗憾的是使用的是Embercardero Delphi 2010。

我目前使用wglOutLineFont(...)构建我的字体显示列表和glCallLists(length(m_Text), UNSIGNED_SHORT, PWchar(m_Text) )来渲染我的字符串。

虽然这对于Latin-1字符来说是可行的,但提前构建完整的Unicode字符集非常耗时(在我的机器上大约需要8.5分钟),因此我正在寻找更有效的解决方案。我考虑将范围限制在u+0020 - u+077f(拉丁文、希腊文、西里尔文、阿拉伯文和希伯来文)之间,只包括我需要的字形,但这只是对当前需求的解决方案,一旦需要其他编码,就会变得不足够。

好消息是,我不必担心从左到右或从右到左的方向,因为我们的应用程序已经可以处理这个问题。

我希望这是一个众所周知的问题,所以我想问问是否有关于这个问题的参考资料在网上,或者您是否可以分享一些见解?

编辑 一个澄清:我使用的是多边形字体表示法。每个字体都是预先以单位大小(1.0)构建的,并且在渲染之前使用glScalef(...)进行适当的缩放。我决定不进行预光栅化,因为用户可能会放大很多(这个应用程序用于CAD),因此光栅化伪影将变得可见。

此外,由于场景很少超过几百个字符(主要是标签和测量),所以从预光栅化中获得的速度增益微不足道。

3个回答

3
不要预先构建显示列表,而是创建一个中间精灵,在需要时构建并缓存列表。尝试预先计算列表或在每种字体大小、字体面和所有字符的情况下预先生成光栅化纹理是不切实际的,特别是当你扩展到远东字符集时。

使用顶点缓冲对象会非常好!字体光栅可以是高分辨率的,然后mipmaps和多重采样就可以完成其余部分。 - Luca
那么您的意思是对于给定的字符串,我应该在知道需要绘制哪些字符后才生成列表? - sum1stolemyname
是的。面对类似的问题 - 我们使用OpenType库(为了平台独立而不是wgl)来渲染包含单词渲染的光栅纹理。然后,我们缓存可见的单词,并且丢弃已经滚动到屏幕外的单词。 我们的应用程序只显示少量文本,没有非常复杂的格式要求,但有足够的潜在文本,预先渲染所有文本将会产生可见的延迟。 - Chris Becke

2
你需要替换 wglOutLineFont
为了做到这一点,需要使用 wglOutLineFont 生成/渲染所需的字形,并将纹理保存到光栅图像文件中。应用程序加载后,需要加载纹理图像和字形纹理坐标(每个字形有4个坐标),并且生成显示列表(每个字形一个列表,每个显示列表绘制单个字形作为纹理四边形)。
每个表示字形的 short 类型都必须对应一个显示列表(它们的值必须匹配,可以使用 glListBase 辅助完成)。
我认为加载纹理比在运行时生成字体显示列表更快。实际上,你将离线进行字形光栅计算。但是,生成显示列表可能很耗费时间(有许多字形)。事实上,你可以在一个独立的线程中运行显示列表生成或只生成你需要的显示列表。

1

我曾经成功地将this tutorial转写成C++,但我不确定它在Delphi中的转换效果如何。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接