前情請見此文。
簡單的說,我希望可以利用OpenGL來作2D繪圖,在上篇文章中已經畫出了有色彩的三角形,這次的目標是把圖檔畫出來。
本文介紹的程式使用了材質貼圖、indexed VBO以及讀取png圖片並形成材質的技術。
文中的程式碼均放置於Github中。
以下是簡單的筆記摘要:
Indexed VBO
當我們畫正方形時,我們可以把正方形拆開成兩個三角形來畫。這時候各位可以發現到我們必須傳送6組頂點資訊過去,而不是認知上的四個。(浪費了0.5倍的記憶體)所以,有一個聰明的傢伙就想到「傳送所有使用到的頂點資訊,以及繪製這些頂點的順序」的方法來節省記憶體。這樣的概念就是所謂的indexed VBO。
一般材質貼圖(gl_texture.c)
簡單的說,我們如果希望指定一個平面上的圖樣(木製地板的木紋,或是地磚上的花紋...),那就會用到材質貼圖的功能了。這個功能不管是2D或是3D繪圖都會用到,很重要的功能!想想如果一個(不是卡通的)場景裡面只有純色而沒有更為豐富的圖樣,那樣的世界不是很單調嗎?(當然,有許多高手利用原本應該會讓人覺得單調的純色以及幾何圖形做出了很好玩的曠世鉅作。)
之前繪製彩色三角形時,我們指定頂點的位置以及頂點對應的顏色。這次,我們指定頂點的位置、該頂點所對應的材質位置,以及所要使用的材質。這樣一來,所指定的圖片就會依照給定的頂點資訊來作貼上。(就像貼海報一樣)
值得注意的是,OpenGL所期待的材質資料是翻轉過來的。也就是說,原本的第一個列(row)應該要放在傳送給OpenGL的資料中的最後一列;原本的最後一列則要放在傳送資料中的第一列,以此類推。當然,如果希望傳送原圖進入顯示卡記憶體中,也可以在指定材質座標(UV)的時候動手腳來得到相同的結果(把V「反過來」)。
灰階材質當作樣板的貼圖法(gl_texture_grayscale.c)
上部份所說的材質貼圖是直接把給定材質原封不動的貼到平面上。這部份則是把所指定的材質作一些轉換之後貼到平面上:我們把灰階材質的「灰階」當成透明度,把所給定的前景顏色和材質上現有的圖案作混合(blending)。這樣的動作,等於是把灰階材質當作是著色的樣板。我們在選好喜歡的顏色之後,照著這個樣板的圖樣來上色。
總之,在這個程式裡面,troll face被我從灰階圖形,變成了紅臉綠底的圖案,貼到畫面上。
沒有留言:
張貼留言