零基礎(chǔ)入門OpenGL系列教程(三、GLUT)

上一篇講述了如何在Xcode中搭建OpenGL開發(fā)環(huán)境送矩,在這篇我會講GLUT相關(guān)函數(shù)。

從上一篇的測試代碼講起

在上一篇中我們用如下的一段代碼來測試OpenGL是否正常運(yùn)行哪替。

#include <iostream>
#include <OpenGL/OpenGL.h>
#include <GLUT/GLUT.h>
void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();
    glFlush();
}
int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutCreateWindow("test");
    glutDisplayFunc(display);
    glutMainLoop();
}

引入頭文件

在早期OpenGL中必須引入這兩個庫<OpenGL/OpenGL.h><GLUT/GLUT.h>栋荸。這兩個頭文件分別對應(yīng)了之前提到的兩個框架,我們運(yùn)用到的大部分函數(shù)都是這個庫里面的。

初始化GLUT

glutInit(&argc, argv);

這個函數(shù)傳了主函數(shù)的兩個參數(shù)蒸其,它除了初始化GLUT庫以外還會與窗口系統(tǒng)溝通敏释。如果操作系統(tǒng)沒有合適的OpenGL或者非法命令行選項(xiàng)就會拋出錯誤,初始化失敗摸袁。

創(chuàng)建窗口

glutCreateWindow("test");

這個函數(shù)被用來創(chuàng)建一個顯示圖像的窗口钥顽。它有一個字符指針類型的參數(shù),用來初始化窗口顯示的名稱靠汁,還有一個整數(shù)類型的返回值蜂大,用來標(biāo)識該創(chuàng)建的窗口。需要注意的是蝶怔,所有新建的窗口都是有單獨(dú)的OpenGL上下文奶浦,也就是說有各自的 狀態(tài)機(jī),因此窗口標(biāo)識符可以用來區(qū)別這些窗口踢星。

OpenGL的狀態(tài)機(jī)就是當(dāng)前狀態(tài)變量及其值構(gòu)成的集合和其他系統(tǒng)狀態(tài)澳叉。OpenGL的狀態(tài)由函數(shù)驅(qū)動,調(diào)用不同的函數(shù)可以改變OpenGL的狀態(tài)

渲染圖形

glutDisplayFunc(display);

這個函數(shù)表現(xiàn)形式很簡單沐悦,但意義不簡單成洗。只有一個參數(shù),用來傳一個渲染圖形的回調(diào)函數(shù)藏否,沒有返回值瓶殃。和前面函數(shù)不同的是,GLUT會根據(jù)狀態(tài)機(jī)中的重顯(redisplay)狀態(tài)來決定是否渲染副签。當(dāng)它需要重顯時遥椿,渲染圖形的回調(diào)函數(shù)就會被調(diào)用,同時被渲染的層(layer)又會被設(shè)置成正常平面(normal plane)淆储。而這個重顯狀態(tài)可以通過隱式和顯式兩種方式轉(zhuǎn)換冠场,其中一種隱式轉(zhuǎn)換就是通過前面調(diào)用glutCreateWindow("test");函數(shù)來轉(zhuǎn)換。

進(jìn)入事件處理循環(huán)

圖形被渲染之后不能讓它馬上結(jié)束程序遏考,因此我們通過加入事件處理循環(huán)來組織窗口的關(guān)閉慈鸠。

glutMainLoop();

這個函數(shù)既沒有參數(shù),也沒有返回值灌具。只是單純的進(jìn)入事件處理循環(huán)使得GLUT不斷的調(diào)用渲染圖形回調(diào)函數(shù)青团。通過這種辦法我們就可以在顯示器看到圖形了。

其他GLUT函數(shù)

  • void glutInitDisplayMode(unsigned int mode)

這個函數(shù)用來初始化顯示方式咖楣,通過傳入一個無符號整數(shù)類型來控制用哪個方式顯示督笆。可以傳入的參數(shù)有GLUT_RGBA诱贿、GLUT_INDEX娃肿、GLUT_SINGLEGLUT_DOUBLE等咕缎。它們可以設(shè)置顏色屬性、緩沖存儲等料扰。

  • void glutInitWindowSize(int width, int height)void glutInitWindowPosition(int x, int y)

這兩個函數(shù)都是對窗口屬性設(shè)置的函數(shù)凭豪,分別是設(shè)置窗口的大小以及窗口的位置,單位是像素晒杈。當(dāng)然不是一定要設(shè)置這些屬性嫂伞,默認(rèn)窗口大小是300px*300px,位置在原點(diǎn)(左上角)拯钻。

  • void glutPostRedisplay(void)

這個函數(shù)就是前面所說的顯示轉(zhuǎn)換重顯狀態(tài)的函數(shù)帖努,也可以說是調(diào)用當(dāng)前窗口的正常平面的渲染圖形回調(diào)函數(shù)。

  • void glutReshapeFunc(void (*func)(int width, int height))

這個函數(shù)是為當(dāng)前窗口注冊渲染圖形回調(diào)函數(shù)的粪般。和之前不同的是它只是注冊一個回調(diào)函數(shù)拼余,而這個函數(shù)是在窗口需要被重繪(reshape)或者新的層覆蓋了窗口時被調(diào)用。此外亩歹,還有一系列以glut開頭并以Func結(jié)尾的函數(shù)匙监,例如glutKeyboardFunc(void (*func)(unsigned char key, int x, int y))glutMouseFunc(void (*func)(int button, int state, int x, int y))glutMotionFunc(void (*func)(int x, int y))等捆憎。我們稱之為事件處理函數(shù)舅柜,它們分別響應(yīng)特殊的事件來調(diào)用相應(yīng)的回調(diào)函數(shù)來處理。

關(guān)于GLUT就解釋到這里躲惰,還有很多函數(shù)可以參考官方文檔。下一篇進(jìn)入OpenGL繪圖部分变抽。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末础拨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子绍载,更是在濱河造成了極大的恐慌诡宗,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击儡,死亡現(xiàn)場離奇詭異塔沃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)阳谍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蛀柴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人矫夯,你說我怎么就攤上這事鸽疾。” “怎么了训貌?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵制肮,是天一觀的道長冒窍。 經(jīng)常有香客問我,道長豺鼻,這世上最難降的妖魔是什么综液? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮儒飒,結(jié)果婚禮上谬莹,老公的妹妹穿的比我還像新娘。我一直安慰自己约素,他們只是感情好届良,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著圣猎,像睡著了一般士葫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上送悔,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天慢显,我揣著相機(jī)與錄音,去河邊找鬼欠啤。 笑死荚藻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的洁段。 我是一名探鬼主播应狱,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祠丝!你這毒婦竟也來了疾呻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤写半,失蹤者是張志新(化名)和其女友劉穎岸蜗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叠蝇,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡璃岳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了悔捶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铃慷。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炎功,靈堂內(nèi)的尸體忽然破棺而出枚冗,到底是詐尸還是另有隱情,我是刑警寧澤蛇损,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布赁温,位于F島的核電站坛怪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏股囊。R本人自食惡果不足惜袜匿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望稚疹。 院中可真熱鬧居灯,春花似錦、人聲如沸内狗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柳沙。三九已至岩灭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赂鲤,已是汗流浹背噪径。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留数初,地道東北人找爱。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像泡孩,于是被迫代替她去往敵國和親车摄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

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