NeHe OpenGL教程 第十二課 顯示列表

2022-03-23 16:13:33 字數 2211 閱讀 8509

**【翻譯】nehe opengl 教程

前言宣告,此 nehe opengl教程系列文章由51部落格yarin

翻譯(2010-08-19),本部落格為**並稍加整理與修改。對nehe的opengl管線教程的編寫,以及yarn的翻譯整理表示感謝。

nehe opengl第十二課:顯示列表

顯示列表:

想知道如何加速你的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;      // 成功返回

}下面的**是鍵盤控制的一些東西 

NeHe OpenGL教程 (十二)

第12課 顯示列表 想知道如何加速你的opengl程式麼?這一課將告訴你如何使用opengl的顯示列表,它通過預編譯opengl命令來加速你的程式,並可以為你省去很多重複的 這次我將教你如何使用顯示列表,顯示列表將加快程式的速度,而且可以減少 的長度。當你在製作遊戲裡的小行星場景時,每一層上至少需要...

火攻第十二

孫子曰 凡火攻有五 一曰火人,二曰火積,三曰火輜,四曰火庫,五曰火隊。行火必有因,因必素具。發火有時,有日。時者,天之燥也。日者,月在箕 壁 翼 軫也。凡此四宿者,風起之日也。凡火攻,必因五火之變而應之 火發於內,則早應之於外 火發而其兵靜者,待而勿攻,極其火力,可從而從之,不可從則上。火可發於外,...

第十二周作業

例題1 includeusing namespace std struct date struct student int main stu1,stu2 stu1.num 1001 stu1.age 20 stu2 stu1 cout includeusing namespace std struc...