上一篇講述了如何在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_SINGLE
和GLUT_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繪圖部分变抽。