opengl 中的多语言 Unicode 渲染

问题描述 投票:0回答:3

我必须扩展 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),因此光栅伪影将变得可见。

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

delphi winapi opengl unicode
3个回答
3
投票

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


2
投票

您需要替换 wglOutLineFont

为此,请使用 wglOutLineFont 生成/渲染所需的字形纹理,然后将纹理保存到光栅图像文件中。应用程序加载后,需要加载纹理图像和字形纹理坐标(每个字形 4 个坐标),并生成显示列表(每个字形一个列表,每个显示列表应绘制一个单独的字形作为纹理四边形)。

代表字形的每个短字符都应有一个相应的显示列表(它们的值非常匹配,glListBase 可以对此提供帮助)。

我认为加载纹理比在运行时生成字体显示列表更快。实际上,您可以离线进行字形栅格计算。但显示列表的生成可能很重(许多字形)。事实上,您可以在单独的线程中运行显示列表生成或仅生成您需要的显示列表。


1
投票

我很幸运地将 本教程 音译为 C++,尽管我不确定它转移到 Delphi 的效果如何。

© www.soinside.com 2019 - 2024. All rights reserved.