2013年3月2日 星期六

使用Freetype2來繪製單一字母

對於一個畫家來說,OpenGL是畫家的手,只能呈現畫家腦袋裡面已經存在的靈感。對於想利用OpenGL來繪製場景的人來說,場景中所出現的人物、圖片、文字等都需要事先準備好(無論以何種形式)。

對於一個遊戲來說,遊戲中所要使用的圖片需要事先畫好;遊戲中所要用的文字需要先寫好。然而,對於以OpenGL為作圖元件的遊戲來說,文字的部份是一個嚴峻的挑戰:OpenGL,和許多提供繪圖功能的元件(Qt, Cairo...)相比,沒有提供文字繪製的功能(連一丁點都沒有!!)

因此,想要利用OpenGL作為繪圖工具,但同時需要呈現文字的話,有幾種方法:

  • 把文字事先以其他的軟體製作成圖片,然後利用材質貼圖把字貼上去。
    本方法對於使用拉丁字母的語言(如英文)來說是最簡單的解決方法,但無法滿足想要放眼世界的野心。
  • 利用其他的元件,把文字繪製出來,再利用材質貼圖把動態繪製的文字圖貼上去。
    缺點就是比較麻煩,也增加了相依性(需要其他可以繪製文字的程式支援)

製作「文字圖」以供OpenGL的方法相當多。可以用Qt, Gtk+, pango, cairo...,但它們不只稍微大了點,而且還無法直接使用所指定的字型檔而必須使用已經安裝在系統中的字型。對於一個想要使用作者自選字型的可攜式軟體來說還需要其他的解決方法。

對於上面囉哩囉唆說了一堆的問題,目前最受歡迎的自由軟體解法是Freetype2。Freetype2是一個小巧的字型程式庫,可以讀取許多格式的字型,並且提供了點陣化(rasterization)以及簡單的輔助文字排列功能。Freetype2所提供的功能足以應付地球上大部分(八成吧)文字排列的需求。

基於我對於各種字型的著迷以及對此主題的興趣(我超喜歡畫圖的喔!),做了一組小小的程式來展示如何利用Freetype2來把單一字母繪製出來。請見這裡

由於對OpenGL還不甚了解(還在學習如何使用材質貼圖..)所以這組程式把所指定的文字輸出到PNG圖檔中。

使用方法

利用cmake來編譯:(記得對build_dir和source_dir作適當的替換)

$ mkdir build_dir
$ cd build_dir
$ cmake source_dir
$ make
接著,假設你想要繪製「好」,則:
$ ft2_char_cairo 好 /usr/share/fonts/wqy-microhei/wqy-microhei.ttc > /tmp/1.png
那麼,「好」字就會被輸出到/tmp/1.png了。

注意事項:

  • 想改變字的色彩?請找到如下的程式碼:
    # define RED (192)
    # define GREEN (255)
    # define BLUE (192)
    void render_glyph_to_stdout(FT_GlyphSlot slot)
    
    然後把RED, GREEN, BLUE括號中的數字改成你想要顏色的RGB元素。
  • 如果您使用Windows,則由於Windows的shell預設不是utf-8,所以在指定中文字可能會有問題。
  • 另外,如果所指定的字型檔中沒有這個字元的話,字就不會被畫出來。

沒有留言:

張貼留言