我必须扩展一个OpenGL渲染系统来支持国际字符(特别是希伯来语、阿拉伯语和西里尔语)。
开发平台为Windows(XP|维斯塔|7),alas using Embercardero Delphi 2010.
我目前使用wglOutLineFont(...)来构建字体的显示列表,使用glCallLists(length(m_Text), UNSIGNED_SHORT, PWchar(m_Text) )
来呈现字符串。
虽然这对于Latin-1字符是可行的,但是提前构建完整的Unicode字符集非常耗时(在我的机器上大约8. 5分钟),所以我正在寻找一个更有效的解决方案。我考虑过将范围限制在u+0020 - u+077 f之间(拉丁文,希腊文,西里尔文,阿拉伯文和希伯来文),以包括只是我需要的字形,但这将只是一个解决方案,为我目前的需要,并将成为不足,一旦其他编码是必要的。
从好的方面来说,我不必担心从左到右或从右到左的方向,因为我们的应用程序已经可以处理这个问题了。
我希望这是一个众所周知的问题,所以我想问一下,网上是否有关于这个问题的参考资料,或者您是否可以分享一些关于这个问题的见解?
编辑说明:我使用多边形字体表示。每个字体都是预先以单位大小(1.0)构建的,并在渲染之前使用glScalef(...)
进行适当的缩放。我决定反对预光栅化,因为用户可能会非常接近地放大(该应用程序用于CAD),因此光栅化伪影将变得可见。
另外,由于场景很少超过几百个字符(主要是标签和测量),因此来自预光栅化的速度增益是可忽略的。
3条答案
按热度按时间sg24os4d1#
不要预先构建显示列表:-创建一个中间精灵,它可以根据需要构建列表,并缓存它们。尝试预先计算列表-或者预先生成每个字体大小、字体外观和所有字符的栅格化纹理是不切实际的,特别是当你缩放到远东字符集时。
yqlxgs2m2#
您需要替换 wglOutLineFont。
要做到这一点,使用 wglOutLineFont 生成/渲染所需的字形纹理,然后将纹理保存到光栅图像文件中。一旦应用程序加载,它需要加载纹理图像和字形纹理坐标(每个字形4个坐标),并生成显示列表(每个字形一个列表,每个显示列表应绘制一个单个字形作为纹理四边形)。
表示字形的每个短应具有对应的显示列表(它们的值非常匹配,并且glListBase可以在这方面提供帮助)。
我想加载一个纹理比在运行时生成字体显示列表要快。实际上,你可以将字形光栅计算离线。但是显示列表的生成可能很繁重(许多字形)。实际上,你可以在一个单独的线程中运行显示列表的生成,或者只生成你需要的显示列表。
8hhllhi23#
我很幸运地将this tutorial音译到C++中,尽管我不确定它能不能很好地转移到 Delphi 中。