第三章、 系統實作
3.1 繪圖功能實作方式
OpenGL 繪圖函式庫在 1992 年由 Silicon Graphics Inc. (SGI)所 提出,是一個跨平臺並被業界視為標準的三維繪圖函式庫[31]。許多 (Orthographic Projection)。
1. 透視投影
後的尺寸。這種投影方式多用於工業設計軟體上,因為要求精 確地將物體各種重要性質真實呈現,不會因為投影使結果有變 形或不符實際的狀況。
圖 3-1:透視投影與垂直投影
繪圖指令可分成三種,幾何圖形的繪製、圖片的繪製、字串的繪 製。接著將分別介紹如何以OpenGL 繪圖函式庫實作各種繪圖功能。
1. 幾何圖形的繪製
圖 3-2 為 AWT 中所有的幾何圖形繪製指令,OpenGL 最基本 的繪圖元素為點、直線以及三角形,因此若要以OpenGL 繪製 出這些基本圖形,得以一連串之直線或三角形組合出各種不同 的圖形。其中無法直接透過線段或三角形組合而成的,就以逼 近的方式來實作,例如圓弧、橢圓、扇形等等。
圖 3-2:AWT 中基本的幾何圖形[25]
圖3-3 為以連續的線段模擬圓形,利用角度與圓的半徑,可求 出圓周上任意位置的點座標。而應該以多少角度的間距逼近,
從圖中可以發現,當以十五度為間距逼近時,人眼已經感覺不 出其為一有稜有角的多邊形,而會將它當作是一個平滑的圓 形。對填滿的圓則利用類似的方式,只是基本元素由線段改為 填滿的三角形。
圖 3-3:用不同數量的線段模擬圓
2. 圖片的繪製
為了能受惠於硬體加速,繪製圖片的指令將以材質貼圖
(Texturing)的方式實作,將一張張需要繪製的圖片,先載入至 顯示卡的記憶體中,產生成一張張的材質,當要繪製該圖片 時,如圖 3-4 所示,將對應的材質(Texture)貼到與圖片大小相 同的矩形(Rectangle)上,達到圖片繪製的效果。
圖 3-4:用材質貼圖來達成圖片繪製
但是OpenGL 繪圖函式庫在產生材質時有些限制,材質的長與 寬必須為二的冪次,若是原始圖片(Source image)之長寬並非 二的冪次,就必須如圖3-5 所示,要事先將圖片的長與寬放大 至二的冪次,此時若還是以一比一的比例進行貼圖,因材質 (Texture)大小已較原始圖片大,故圖片繪製結果會縮小。因此 在貼圖時,長與寬並非二的冪次之情況必須計算對應的材質區 塊,避免將整張尺寸已變大之材質以一比一之比例貼上。不過 OpenGL 的擴充功能可以支援長寬並非二的冪次之材質,但此 功能在較新的顯示卡上才有支援。
圖 3-5:材質的長與寬必須是二的冪次
3. 字串的繪製
OpenGL 本身的 API 並沒有提供直接繪製字串之功能,因此字 串的繪製方式有三種:位元映射圖(Bitmap)、材質貼圖(Texture) 以及輪廓繪製(Outline)。圖 3-6 為三種不同繪製方式所展現出 來的不同效果。
圖 3-6:字串繪製的三種方式
位元映射圖儲存了文字的像素(pixel)資料,每個像素以一位元 儲存。材質貼圖為將每個字都先以圖片的方式繪製出來,最後 在繪製字串時,將每個字都以材質的方式繪製到對應的位置。
這種方式能夠擁有較好的效果,因為可以在繪製成圖片時,選 用較好的解析度甚至先作反鋸齒效果後,再以材質貼圖的方式 繪製。然而這兩種方式,在直接放大來繪製字型點數大的字串 時,會使得繪製的品質降低,如圖3-6 Bitmap 與 Texture 兩張 圖所示,在邊緣的地方將會看到鋸齒狀出現。而材質貼圖比位 元遮罩好的原因在於其受惠於硬體加速,因此繪圖效能比較 好。
輪廓繪製是將每個字的輪廓以線段的方式組合成一個或數個 多邊形,如圖 3-6 Outline 此圖所示,因這種方式將字以幾何圖 形呈現,所以在繪製尺寸較大的字時不會有品質變差的情況產 生,還能夠應用於三維立體的字,或是其他幾何圖形能擁有的 效果,例如光影。但當繪製筆畫較複雜的文字時,例如中文字,
因為要處理的多邊形變多,使得繪製的效能會因此下降。
本論文考慮以上各種方式的優缺點後,採用材質貼圖與輪廓繪 製兩種方式混合使用。當字型大小大於16 點時,因圖片耗用 記憶體的考量,我們採用輪廓繪製的方式。而字型大小在 16 點以下時,則選用材質貼圖的方式,但為改善材質貼圖繪字時 的缺點,將動態產生不同大小之材質,用作不同大小字體的繪 製。為減少重覆產生材質所造成的影響,我們快取(Cache)了 已經產生過的材質,未來若要繪製同樣的字時,就不必再重新 產生同樣的材質,對於效能上將會有較好的提升。