第12課
顯示列表:
想知道如何加速你的opengl程式麼?這一課將告訴你如何使用opengl的顯示列表,它通過預編譯opengl命令來加速你的程式,並可以為你省去很多重複的**。
這次我將教你如何使用顯示列表,顯示列表將加快程式的速度,而且可以減少**的長度。
當你在製作遊戲裡的小行星場景時,每一層上至少需要兩個行星,你可以用opengl中的多邊形來構造每乙個行星。聰明點的做法是做乙個迴圈,每個迴圈畫出行星的乙個面,最終你用幾十條語句畫出了乙個行星。每次把行星畫到螢幕上都是很困難的。當你面臨更複雜的物體時你就會明白了。
那麼,解決的辦法是什麼呢?用現實列表,你只需要一次性建立物體,你可以貼圖,用顏色,想怎麼弄就怎麼弄。給現實列表乙個名字,比如給小行星的顯示列表命名為「asteroid」。現在,任何時候我想在螢幕上畫出行星,我只需要呼叫glcalllist(asteroid)。之前做好的小行星就會立刻顯示在螢幕上了。因為小行星已經在顯示列表裡建造好了,opengl不會再計算如何構造它。它已經在記憶體中建造好了。這將大大降低cpu的使用,讓你的程式跑的更快。
那麼,開始學習咯。我稱這個demo為q-bert顯示列表。最終這個demo將在螢幕上畫出15個立方體。每個立方體都由乙個盒子和乙個頂部構成,頂部是乙個單獨的顯示列表,盒子沒有頂。
這一課是建立在第六課的基礎上的,我將重寫大部分的**,這樣容易看懂。下面的這些**在所有的課程中差不多都用到了。
下面設定變數。首先是儲存紋理的變數,然後兩個新的變數用於顯示列表。這些變數是指向記憶體中顯示列表的指標。命名為box和top。
然後用兩個變數xloop,yloop表示螢幕上立方體的位置,兩個變數xrot,yrot表示立方體的旋轉。
gluint box; // 儲存盒子的顯示列表
gluint top; // 儲存盒子頂部的顯示列表
gluint xloop; // x軸迴圈變數
gluint yloop; // y軸迴圈變數
接下來建立兩個顏色陣列
static glfloat boxcol[5][3]= // 盒子的顏色陣列
,,,,
};static glfloat topcol[5][3]= // 頂部的顏色陣列
,,,,
};現在正式開始建立顯示列表。你可能注意到了,所有創造盒子的**都在第乙個顯示列表裡,所有創造頂部的**都在另乙個列表裡。我會努力解釋這些細節。
glvoid buildlists() // 建立盒子的顯示列表
if (textureimage[0]=loadbmp("data/cube.bmp"))
改變視窗大小的**和第六課是一樣的。
初始化的**只有一點改變,加入了一行buildlist()。請注意**的順序,先讀入紋理,然後建立顯示列表,這樣當我們建立顯示列表的時候就可以將紋理貼到立方體上了。
buildlists(); // 建立顯示列表
接下來的三行使燈光有效。light0一般來說是在顯示卡中預先定義過的,如果light0不工作,把下面那行注釋掉好了。
最後一行的gl_color_material使我們可以用顏色來貼紋理。如果沒有這行**,紋理將始終保持原來的顏色,glcolor3f(r,g,b)就沒有用了。總之這行**是很有用的。
glenable(gl_light0); // 使用預設的0號燈
glenable(gl_lighting); // 使用燈光
glenable(gl_color_material); // 使用顏色材質
現在到了繪製**的地方了,我們還是和以前一樣,以清除背景顏色為開始。
接著把紋理繫結到立方體,我可以把這些**加入到顯示列表中,但我還是把它留在了顯示列表外邊,這樣我可以隨便設定紋理。
int drawglscene(glvoid) // 繪製操作開始
}return true; // 成功返回
}下面的**是鍵盤控制的一些東西
swapbuffers(hdc); // 交換快取
if (keys[vk_left]) // 左鍵是否按下
if (keys[vk_right]) // 右鍵是否按下
if (keys[vk_up]) // 上鍵是否按下
if (keys[vk_down]) // 下鍵是否按下
NeHe OpenGL教程 第十二課 顯示列表
翻譯 nehe opengl 教程 前言宣告,此 nehe opengl教程系列文章由51部落格yarin 翻譯 2010 08 19 本部落格為 並稍加整理與修改。對nehe的opengl管線教程的編寫,以及yarn的翻譯整理表示感謝。nehe opengl第十二課 顯示列表 顯示列表 想知道如何...
NeHe OpenGL教程 (十六)
第16課 霧 這一課是基於第7課的 的,你將學會三種不同的霧的計算方法,以及怎樣設定霧的顏色和霧的範圍。這篇教程由chris aliotta編寫。你想給你的opengl程式新增霧效?我將在這篇教程中教你如何去做。這是我第一次寫教程,我也只是opengl c 程式設計的新手,所以如果你發現了什麼錯誤請...
NeHe OpenGL教程 (二十)
20課 蒙板 到目前為止你已經學會如何使用alpha混合,把乙個透明物體渲染到螢幕上了,但有的使用它看起來並不是那麼的復合你的心意。使用蒙板技術,將會按照你蒙板的位置精確的繪製。歡迎來到第20課的教程,bmp影象被給各種作業系統所支援,因為它簡單,所以可以很輕鬆的作為紋理載入它。知道現在,我們在把影...