本文主要參考來自:https://github.com/wzpan/orgwiki/blob/master/opengl_basic.org
1.OpenGL數(shù)據(jù)類型
為了保證移植性窘游,OpenGL定義了自己的數(shù)據(jù)類型杈曲。表2.1列出了OpenGL數(shù)據(jù)類型魄衅、它們在32位 環(huán)境(Win32/OS X等)中對應(yīng)的C/C++數(shù)據(jù)類型以及正確的字面值后綴。
所有的數(shù)據(jù)類型都以GL開頭萌朱,表示OpenGL凝果。隨后是它們對應(yīng)的C數(shù)據(jù)類型(如byte汇在、short浓恳、int、float等)笛谦,有些前面還有個(gè)u镀娶,表示這是一種無符號數(shù)據(jù)類型。在有些用法中揪罕,OpenGL使用了更具描述性的名字梯码,比如在類型中增加一個(gè)size表示這種類型的長度或深度。例如好啰,GLsizei是一個(gè)OpenGL變量轩娶,它用一個(gè)整數(shù)來表示一個(gè)size參數(shù);clamp則是一種提示框往,表示這個(gè)值的范圍將“截取”在0.0~1.0的范圍內(nèi)鳄抒;GLboolean變量表示真假條件;GLenum表示枚舉變量;GLbitfield表示那些包含二進(jìn)制位段的變量许溅。
OpenGL并沒有對指針和數(shù)組做特殊的考慮瓤鼻。我們可以像下面這樣聲明一個(gè)包含10個(gè)GLshort變量的數(shù)組:
GLshort shorts[10];
下面這行代碼則聲明了一個(gè)長度為10的GLdouble類型的指針數(shù)組:
GLdouble *doubles[10];
2.錯(cuò)誤處理
OpenGL在內(nèi)部維護(hù)了一組標(biāo)志(共6個(gè))。每個(gè)標(biāo)志代表一種不同類型的錯(cuò)誤贤重。當(dāng)一個(gè)錯(cuò)誤發(fā)生時(shí)茬祷,與這個(gè)錯(cuò)誤相對應(yīng)的標(biāo)志就會被設(shè)置。為了觀察哪些標(biāo)志被設(shè)置并蝗,可以調(diào)用 glGetError 函數(shù)祭犯。
GLenum glGetError(void);
glGetError 函數(shù)返回下表所列的其中一個(gè)值。GLU函數(shù)庫自己定義了3個(gè)錯(cuò)誤滚停,但這些錯(cuò)誤正好與其中已經(jīng)存在的2個(gè)標(biāo)志匹配沃粗。如果被設(shè)置的標(biāo)志不止一個(gè), glGetError 仍然只返回一個(gè)唯一的值键畴。當(dāng) glGetError 函數(shù)被調(diào)用時(shí)最盅,這個(gè)值隨后被清除,然后 glGetError 將再次返回一個(gè)錯(cuò)誤標(biāo)志或 GL_NO_ERROR 起惕。通常涡贱,需要在一個(gè)循環(huán)中調(diào)用 glGetError 函數(shù),持續(xù)檢查錯(cuò)誤標(biāo)志疤祭,直到返回值是 GL_NO_ERROR 。
我們可以使用GLU函數(shù)庫的另一個(gè)函數(shù) gluErrorString 來獲得一個(gè)描述錯(cuò)誤標(biāo)志的字符串饵婆。
const GLubyte* gluErrorString(GLenum errorcode);
3.狀態(tài)機(jī)
狀態(tài)機(jī)是一個(gè)抽象的模型勺馆,表示一組狀態(tài)變量的集合。每個(gè)狀態(tài)變量可以有各種不同的值侨核,例如可以打開或關(guān)閉等草穆。當(dāng)我們在OpenGL中進(jìn)行繪圖時(shí),如果每次都要指定所有這些變量顯然有點(diǎn)不切實(shí)際搓译。反之悲柱,OpenGL使用了一種狀態(tài)模型(或稱狀態(tài)機(jī))來追蹤所有的OpenGL狀態(tài)變量。當(dāng)一個(gè)狀態(tài)值被設(shè)置之后些己,它就一直保持這個(gè)狀態(tài)豌鸡,直到其他函數(shù)對它進(jìn)行了修改。許多狀態(tài)只是簡單的打開或關(guān)閉段标。
例如涯冠,光照要么打開,要么關(guān)閉逼庞。如果幾何圖形不使用光照蛇更,那么在繪制這個(gè)幾何圖形的顏色集合時(shí)就不必進(jìn)行任何光照計(jì)算。如果啟用了光照效率,那么此后所繪制的幾何圖形都將進(jìn)行光照計(jì)算派任。
為了打開這些類型的狀態(tài)變量砸逊,可以使用下面這個(gè)OpenGL函數(shù)。
void glEnable(GLenum capability);
我們可以使用下面這個(gè)對應(yīng)的函數(shù)掌逛,將這些變量的狀態(tài)設(shè)置為關(guān)閉师逸。
void glDisable(GLenum capability);
以光照為例,可以使用下面這個(gè)函數(shù)調(diào)用打開光照效果颤诀。
glEnable(GL_LIGHTING);
也可以使用下面這個(gè)函數(shù)調(diào)用關(guān)閉光照效果字旭。
glDisable(GL_LIGHTING);
如果希望對一個(gè)狀態(tài)變量進(jìn)行測試,判斷它是否被打開崖叫,OpenGL還提供了一種方便的機(jī)制遗淳。
GLboolean glIsEnabled(GLenum capability);
但是,并不是所有的狀態(tài)變量都是簡單的打開或關(guān)閉心傀。許多OpenGL函數(shù)專門用于設(shè)置變量的值屈暗,此后這些變量將一直保持被設(shè)置時(shí)的值,直到再次被修改脂男。在任何時(shí)候养叛,都可以查詢這些變量的值,OpenGL提供了一組查詢函數(shù)宰翅,可以查詢布爾型弃甥、整型、單精度浮點(diǎn)型和雙精度浮點(diǎn)型變量的值汁讼。這4個(gè)函數(shù)的原型如下所示淆攻。
void glGetBooleanv(GLenum pname, GLboolean *params);
void glGetDoublev(GLenum pname, GLdouble *params);
void glGetFloatv(GLenum pname, GLfloat *params);
void glGetIntegerv(GLenum pname, GLint *params);
每個(gè)函數(shù)返回單個(gè)值,或者返回一個(gè)數(shù)組嘿架,把一些值存儲到參數(shù)所指定的地址中瓶珊。