我必须扩展一个OpenGL-Rendering系统以支持国际字符(特别是希伯来语,阿拉伯语和西里尔字母)。
开发平台是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(拉丁语,希腊语,西里尔语,阿拉伯语和希伯来语)到我需要的字形只包括,但这只是我当前需求的解决方案,并且将变得不足一次需要其他编码。
从好的方面来说,我不必担心从左到右或从右到左的方向,因为我们的应用程序已经可以处理这个问题了。
我希望这是一个众所周知的问题,所以我想问一下网上是否有任何参考资料,或者您是否可以分享一些有关此问题的见解?
修改
澄清:我使用多边形字体表示。每个Font都预先以单位大小(1.0)构建,并在渲染之前使用glScalef(...)
进行适当缩放。我确实决定不进行预栅格化,因为用户可能会非常接近地放大(应用程序用于CAD),因此光栅工件将变得可见。
此外,由于场景很少超过几百个字符(主要是标签和测量),因此预光栅化的速度增益可以忽略不计。
答案 0 :(得分:3)
不要预先构建显示列表: - 创建一个中间精灵,按需构建列表并缓存它们。尝试预先计算列表 - 或者为每个字体大小,字体和所有字符预生成栅格化纹理都是不切实际的,特别是当您扩展到远东字符集时。
答案 1 :(得分:2)
您需要替换 wglOutLineFont 。
为此,使用 wglOutLineFont 生成/渲染以纹理所需的字形,然后将纹理保存到光栅图像文件中。一旦应用程序加载,它需要加载纹理图像和字形纹理坐标(每个字形4个坐标),并生成显示列表(每个字形一个列表,每个显示列表应绘制单个字形作为纹理四边形)。
每个代表一个字形的短语都应该有一个相应的显示列表(它们的值匹配很多,glListBase可以帮助它)。
我认为加载纹理比在运行时生成字体显示列表更快。实际上,您将离线移动字形栅格计算。但显示列表生成可能很重(许多字形)。实际上,您可以在显示列表生成的单独线程中运行,或仅生成您需要的显示列表。
答案 2 :(得分:1)
我很幸运地将this tutorial音译为C ++,但我不确定它将如何转移到Delphi。