代码之家  ›  专栏  ›  技术社区  ›  sum1stolemyname

opengl中的多语言unicode绘制

  •  7
  • sum1stolemyname  · 技术社区  · 15 年前

    我必须扩展一个opengl渲染系统来支持国际字符(尤其是希伯来语、阿拉伯语和西里尔语)。

    开发平台是windows(xp vista 7),可惜使用的是embercardero delphi 2010。

    我目前使用wgloutlinefont(…)来构建我的字体的显示列表和 glCallLists(length(m_Text), UNSIGNED_SHORT, PWchar(m_Text) ) 来渲染我的琴弦。

    虽然这对于拉丁1字符是可行的,但是提前构建完整的unicode字符集非常耗时(在我的机器上大约8.5分钟),所以我正在寻找一个更有效的解决方案。我曾考虑将u+0020-u+077f(拉丁语、希腊语、西里尔语、阿拉伯语和希伯来语)的范围限制为仅包含我需要的字形,但这只是满足我当前需要的一个解决方案,一旦需要其他编码,将变得不足。

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

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

    编辑 澄清:我使用多边形字体表示。每个字体都是预先按单位大小(1.0)构造的,并使用 glScalef(...) 在渲染之前。我确实决定不进行预光栅化,因为用户可能会非常近距离地放大(应用程序用于CAD),所以光栅化工件将变得可见。

    此外,由于场景很少超过几百个字符(主要是标签和测量),预光栅化的速度增益可以忽略不计。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Chris Becke    15 年前

    不要预先构建显示列表:-创建一个按需构建列表并缓存它们的中间精灵。尝试预计算列表-或预生成每种字体大小、字体面和所有字符的光栅化纹理是不切实际的,尤其是当您缩放到远东字符集时。

        2
  •  2
  •   Luca    15 年前

    你需要更换 WgloutLineFont字体 .

    为此,使用 WgloutLineFont字体 ,然后将纹理保存到光栅图像文件中。应用程序加载后,需要加载纹理图像和glyph纹理坐标(每个glyph有4个坐标),并生成显示列表(每个glyph有一个列表,每个显示列表应绘制一个glyph作为纹理四边形)。

    代表字形的每个短字符都应有相应的显示列表(它们的值非常匹配,gllistbase可以在这方面提供帮助)。

    我认为加载纹理比在运行时生成字体显示列表要快。实际上,您可以将字形光栅计算脱机。但是显示列表的生成可能很繁重(许多字形)。实际上,您可以在单独的线程中运行显示列表生成,或者只生成您需要的显示列表。

        3
  •  1
  •   genpfault    15 年前

    我的音译很走运 this tutorial 进入C++,虽然我不确定它会传输到Delphi有多好。