NeHe OpenGL教程 (十二)

2021-05-01 20:10:54 字數 2147 閱讀 8845

第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影象被給各種作業系統所支援,因為它簡單,所以可以很輕鬆的作為紋理載入它。知道現在,我們在把影...