2010-03-15 62 views
7

我必須擴展OpenGL-Rendering系統以支持國際字符(特別是希伯來語,阿拉伯語和西里爾語)。opengl中的多語言Unicode渲染

開發平臺是Windows(XP | Vista的| 7),唉使用Embercardero德爾福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

不要預先構建顯示列表: - 創建一個按需構建列表的中間精靈,並對它們進行高速緩存。嘗試預先計算列表 - 或者預先生成每種字體大小,字體面和所有字符的柵格化紋理是不切實際的,特別是當您擴展到遠東字符集時。

+0

使用頂點緩衝對象會非常好!字體柵格可以高分辨率,然後使用mipmap和多重採樣。 – Luca 2010-03-15 21:23:59

+0

所以你的意思是我應該生成列表,一旦我知道哪些字符,我將需要繪製給定的字符串? – sum1stolemyname 2010-03-16 06:52:15

+0

是的。面對類似的問題 - 並使用OpenType庫(對於平臺標識而不是wgl),我們使用渲染包含文字渲染的柵格化紋理進行渲染。然後,我們緩存可見的單詞,並丟棄任何已經在屏幕上滾動的單詞。 我們的應用程序只顯示少量文本,沒有非常複雜的格式要求,但有足夠的潛在文本預渲染它會導致明顯的延遲。 – 2010-03-16 07:39:15

1

我已經有幸將this tutorial轉換成C++,但我不確定它將轉移到Delphi的效果如何。

2

您需要更換wglOutLineFont

爲此,使用wglOutLineFont生成/渲染紋理所需的字形,然後將紋理保存到柵格圖像文件中。加載應用程序後,需要加載紋理圖像和字形紋理座標(每個字形4個座標),並生成顯示列表(每個字形一個列表,每個顯示列表將繪製一個單個字形作爲紋理四邊形)。

代表一個字形的每一個短都應該有一個相應的顯示列表(它們的值非常匹配,並且glListBase可以在這方面提供幫助)。

我想加載紋理比在運行時生成字體顯示列表更快。實際上,您可以脫機字形光柵計算。但顯示列表生成可能很重(很多字形)。事實上,您可以在獨立的線程中運行顯示列表生成或僅生成您的需求所需的顯示列表。