OpenGL數(shù)據(jù)類型和狀態(tài)機(jī)

本文主要參考來自: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)制位段的變量许溅。


image.png

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 。

image.png

我們可以使用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ù)所指定的地址中瓶珊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市耸彪,隨后出現(xiàn)的幾起案子伞芹,更是在濱河造成了極大的恐慌,老刑警劉巖蝉娜,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唱较,死亡現(xiàn)場離奇詭異,居然都是意外死亡召川,警方通過查閱死者的電腦和手機(jī)绊汹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扮宠,“玉大人西乖,你說我怎么就攤上這事狐榔。” “怎么了获雕?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵薄腻,是天一觀的道長。 經(jīng)常有香客問我届案,道長庵楷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任楣颠,我火速辦了婚禮尽纽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘童漩。我一直安慰自己弄贿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布矫膨。 她就那樣靜靜地躺著差凹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侧馅。 梳的紋絲不亂的頭發(fā)上危尿,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音馁痴,去河邊找鬼谊娇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛罗晕,可吹牛的內(nèi)容都是我干的济欢。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼攀例,長吁一口氣:“原來是場噩夢啊……” “哼船逮!你這毒婦竟也來了顾腊?” 一聲冷哼從身側(cè)響起粤铭,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杂靶,沒想到半個(gè)月后梆惯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吗垮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年垛吗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烁登。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怯屉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锨络,我是刑警寧澤赌躺,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站羡儿,受9級特大地震影響礼患,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掠归,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一缅叠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧虏冻,春花似錦肤粱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至领铐,卻和暖如春悯森,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绪撵。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工瓢姻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人音诈。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓幻碱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親细溅。 傳聞我的和親對象是個(gè)殘疾皇子褥傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容