OpenGL入門學習筆記一

OpenGL學習第一課

第一步,選擇一個編譯環境
現在Windows系統的主流編譯環境有Visual Studio,Broland C++ Builder,Dev-C++等,它們都是支持OpenGL的。但這裏我選擇Visual Studio 2003作爲學習OpenGL的環境。

第二步,安裝GLUT工具包
GLUT不是OpenGL所必須的,但它會給我們的學習與開發帶來一定的方便,推薦安裝。
Windows環境下的GLUT下載地址:(大小約爲150k)
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
無法從以上地址下載的話請使用下面的連接:
http://upload.programfan.com/upfile/200607311626279.zip
Windows環境下安裝GLUT的步驟:
1、將下載的壓縮包解開,將得到5個文件
2、在“我的電腦”中搜索“gl.h”,並找到其所在文件夾。把解壓得到的glut.h放到這個文件夾。
3、把解壓得到的glut.lib和glut32.lib放到靜態函數庫所在文件夾。
4、把解壓得到的glut.dll和glut32.dll放到操作系統目錄下面的system32文件夾內。(典型的位置爲:C:/Windows/System32)

第三步,建立一個OpenGL工程

然後選擇Win32 Console Application/Empty projec
然後向該工程添加一個代碼文件,取名爲“OpenGL.c”,注意用.c來作爲文件結尾。
搞定了,就跟平時的工程沒什麼兩樣的。

第一個OpenGL程序

一個簡單的OpenGL程序如下:(注意,如果需要編譯並運行,需要正確安裝GLUT,安裝方法如上所述)

#include <GL/glut.h>

void myDisplay(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("第一個OpenGL程序");
    glutDisplayFunc(&myDisplay);
    glutMainLoop();
    return 0;
}

該程序的作用是在一個黑色的窗口中央畫一個白色的矩形。下面對各行語句進行說明。


首先,需要包含頭文件#include <GL/glut.h>,這是GLUT的頭文件。
本來OpenGL程序一般還要包含<GL/gl.h>和<GL/glu.h>,但GLUT的頭文件中已經自動將這兩個文件包含了,不必再次包含。

然後看main函數。
int main(int argc, char *argv[]),這個是帶命令行參數的main函數
注意main函數中的各語句,除了最後的return之外,其餘全部以glut開頭。這種以glut開頭的函數都是GLUT工具包所提供的函數,下面對用到的幾個函數進行介紹。
1、glutInit,對GLUT進行初始化,這個函數必須在其它的GLUT使用之前調用一次。其格式比較死板,一般照抄這句glutInit(&argc, argv)就可以了。
2、 glutInitDisplayMode,設置顯示方式,其中GLUT_RGB表示使用RGB顏色,與之對應的還有GLUT_INDEX(表示使用索引顏色)。GLUT_SINGLE表示使用單緩衝,與之對應的還有GLUT_DOUBLE(使用雙緩衝)。更多信息,請自己Google。當然以後的教程也會有一些講解。
3、glutInitWindowPosition,這個簡單,設置窗口在屏幕中的位置。
4、glutInitWindowSize,這個也簡單,設置窗口的大小。
5、glutCreateWindow,根據前面設置的信息創建窗口。參數將被作爲窗口的標題。注意:窗口被創建後,並不立即顯示到屏幕上。需要調用glutMainLoop才能看到窗口。
6、glutDisplayFunc,設置一個函數,當需要進行畫圖時,這個函數就會被調用。(這個說法不夠準確,但準確的說法可能初學者不太好理解,暫時這樣說吧)。
7、glutMainLoop,進行一個消息循環。(這個可能初學者也不太明白,現在只需要知道這個函數可以顯示窗口,並且等待窗口關閉後纔會返回,這就足夠了。)

在glutDisplayFunc函數中,我們設置了“當需要畫圖時,請調用myDisplay函數”。於是myDisplay函數就用來畫圖。觀察myDisplay中的三個函數調用,發現它們都以gl開頭。這種以gl開頭的函數都是OpenGL的標準函數,下面對用到的函數進行介紹。
1、glClear,清除。GL_COLOR_BUFFER_BIT表示清除顏色,glClear函數還可以清除其它的東西,但這裏不作介紹。
2、glRectf,畫一個矩形。四個參數分別表示了位於對角線上的兩個點的橫、縱座標。
3、glFlush,保證前面的OpenGL命令立即執行(而不是讓它們在緩衝區中等待)。其作用跟fflush(stdout)類似。

在此簡單介紹一下OpenGL的函數庫OpenGL實用工具包(GLUT):
1、核心庫 115個庫函數,每個函數都以gl開頭,這些函數是最基本的,它們可以在任何OpenGL的工作平臺上應用。這些函數用於建立各種各樣的形體,產生光照效果,進行反走樣以及進行紋理映射,進行投影變換等等。由於這些核心函數有許多種形式並能夠接受不同類型的參數,實際上這些函數可以派生出300多個函數。
2、實用庫:43個函數,每個函數以glu開頭;是比OpenGL核心函數更高一層的函數,這些函數是通過調用核心函數來起作用的。它們可以在任何OpenGL的工作平臺上應用。這些函數提供了十分簡單的用法,從而減輕了開發者的編程負擔。OpenGL的實用函數包括紋理映射、座標變換、多邊形分化、繪製一些如橢球、圓柱、茶壺等簡單多邊形實體等。這部分函數象核心函數一樣在任何OpenGL平臺都可以應用。
3、輔助庫:31個函數,每個函數以aux開頭;這些函數本來是用於初學者做簡單的練習之用,因此這些函數不能在所有的OpenGL平臺上使用,在Windows NT環境下可以使用這些函數。這些函數使用簡單,它們可以用於窗口管理、輸入輸出處理以及繪製一些簡單的三維形體。爲了使OpenGL的應用程序具有良好的移植性,在使用OpenGL輔助庫的時候應謹慎。
4、專用庫函數,每種窗口都有一個用於擴展窗口系統功能,以支持OpenGL渲染的函數庫。在使用X窗口系統的計算機中,提供了X窗口系統的OpenGL擴展(GLX),作爲OpenGL的附加。GLX庫函數的名稱中包含前綴"glX"。在windows系統上,6個以wgl開頭的函數提供了額windows和OpenGL之間的接口。
5、OpenGL實用工具包(GLUT,OpenGL Utility Toolkit)是Mark Kilgard開發的一個獨立於窗口系統的工具包,用於繞開窗口系統API的複雜性。GLUT函數名中包含前綴"glut"。
6、Win32 API函數:5個函數,函數前面沒有專用前綴;用於處理象素存儲格式和雙緩衝區,顯然這些函數僅僅能夠用於Win32系統而不能用於其他OpenGL平臺。

OpenGL實用工具包(GLUT)介紹:
OpenGL包含渲染函數,但被涉及成獨立於任何窗口系統和操作系統。因此,OpenGL並沒用用於打開窗口以及檢測鍵盤或鼠標事件的函數。GLUT庫被用來簡化這些相關任務,此外還提供了一些用於創建複雜三位物體(如球體、圓環和茶壺等)的函數。
    窗口管理函數
   glutInit(int *argc, char **argv),初始化GLUT並處理命令行參數,應在調用其他GLUT函數前調用glutInit()。
   glutInitDisplayMode(unsigned int mode),指定使用RGBA模式還是顏色索引模式。還可以指定使用單緩存還是雙緩存等。
   glutInitWindowPosition(int x, int y),指定窗口左上角在屏幕上的位置。
   glutInitWindowSize(int width, int size),指定窗口的大小,單位爲象素。
   int glutCreateWindow(char *string),使用一個OpenGL場景創建一個窗口,該函數返回一個標識符,唯一的標識新建的窗口,注意,在調用glutMainLoop()之前,窗口不會被顯示出來。
    顯示回調函數
   glutDisplayFunc(void(*func)(void))是最重要的時間回調函數。每當GLUT認爲需要重新顯示窗口的內容時,都將執行函數glutDisplayFunc()函數註冊的回調函數,因此,應將爲重新繪製場景需要調用的函數都放到顯示回調函數中。如果程序修改了窗口的內容,可能需要調用函數glutPostRedisplay(void),它提醒函數glutMainLoop調用註冊的顯示回調函數。
    運行程序
   glutMainLoop(void),顯示創建的所有窗口,被渲染到這些窗口中的內容也將顯示出來。程序開始事件處理,這冊的顯示回調函數被觸發,進入該循環,便不會退出。
    處理輸入事件
   glutReshapeFunc(void(*func)(int w, int h)),指定窗口大小發生改變時應採取的措施;
   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)),這冊了當用戶按下鼠標按鈕並移動鼠標時應調用的回調函數。
    管理後臺處理
   glutIdleFunc(void(*func)(void))指定一個在沒有其他事件需要處理時(如事件循環空閒)執行的函數。
    繪製三維物體
   glutWireCube(GLdouble size)、glutSolidCube(GLdouble size)、glutWireSphere(GLdouble radius, GLint slices,GLint statcks)、glutSolidSphere(GLdouble radius, GLint slices, GLint stacks)等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章