OpenGL编程轻松入门(一)
生活随笔
收集整理的這篇文章主要介紹了
OpenGL编程轻松入门(一)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
OpenGL編程輕松入門(一) (由同事黃燕創(chuàng)作) ? 本文介紹了有關(guān)OpenGL的基本知識(shí),主要涉及顏色、繪制幾何體、坐標(biāo)變換、堆棧操作、顯示列表、光照和材質(zhì)、紋理映射、特殊效果、曲面和曲線的繪制、二次幾何體繪制、像素操作、如何繪制動(dòng)畫物體及菜單管理。通過對(duì)本文及本文中例子的理解消化,你可以較容易地進(jìn)入OpenGL的世界。相信,再通過一段時(shí)間的學(xué)習(xí),你將很快成為OpenGL高手。 1.???????? OpenGL背景簡(jiǎn)介 OpenGL(Open Graphics Library)是圖形硬件的一個(gè)軟件接口,也是該領(lǐng)域的工業(yè)標(biāo)準(zhǔn)。圖形程序員利用這些指令可以創(chuàng)建高質(zhì)量的交互式的三維應(yīng)用。OpenGL的前身是SGI(Silicon Graphics)公司為其圖形工作站開發(fā)的IRIS GL。IRIS GL雖然功能強(qiáng)大但是移植性不好,于是SGI公司便在IRIS GL的基礎(chǔ)上開發(fā)了OpenGL。 OpenGL是一個(gè)與硬件無關(guān)的軟件接口。可以在不同的平臺(tái)如Windows 95、Windows NT、Unix、Linux、MacOS、OS/2之間進(jìn)行移植。因此,支持OpenGL的軟件具有很好的移植性,可以獲得非常廣泛的應(yīng)用。 OpenGL是網(wǎng)絡(luò)透明的,具有網(wǎng)絡(luò)功能。即便客戶機(jī)和服務(wù)器是不同類型的計(jì)算機(jī)OpenGL程序也可以在網(wǎng)絡(luò)上運(yùn)行。這一點(diǎn)對(duì)于制作大型3D圖形、動(dòng)畫非常有用。例如,《玩具總動(dòng)員》、《泰坦尼克》等電影的電腦特技畫面就是通過應(yīng)用OpenGL的網(wǎng)絡(luò)功能,使用120多臺(tái)圖形工作站共同工作來完成的。 OpenGL的發(fā)展一直處于一種較為遲緩的態(tài)勢(shì),每次版本的提高新增的技術(shù)很少,大多只是對(duì)其中部分做出修改和完善。隨著DirectX的不斷發(fā)展和完善,OpenGL的優(yōu)勢(shì)逐漸喪失,至今雖然已有3Dlabs提倡開發(fā)的2.0版本面世,在其中加入了很多類似于DirectX中可編程單元的設(shè)計(jì),但廠商的用戶認(rèn)知程度并不高,未來的OpenGL發(fā)展前景迷茫。 但是OpenGL具有許多優(yōu)勢(shì),這些優(yōu)勢(shì)可以為硬件及軟件研發(fā)人員提供很多便利。首先,它是行業(yè)標(biāo)準(zhǔn),得到廣泛的技術(shù)支持,是唯一的真正開放、穩(wěn)定、和銷售商無關(guān)的、多平臺(tái)的圖形標(biāo)準(zhǔn)。第二,可靠性和可移植性。第三,允許新功能的加入。第四,可在從PC機(jī)到超級(jí)計(jì)算機(jī)不同級(jí)別的機(jī)器上運(yùn)行。第四,容易使用,一般的應(yīng)用程序幾行代碼就可以完成,并且無需考慮硬件。第五,具有大量文檔,例子可供參考。 注意,在不同的平臺(tái)如何安裝OpenGL,如何設(shè)置運(yùn)行環(huán)境會(huì)有一些不同。為了力求講解的形象生動(dòng),本文舉了十多個(gè)例子,這些例子都是在Windows 2000平臺(tái),Microsoft Visual C++ 6.0環(huán)境下編譯運(yùn)行的。 作者將盡量詳盡地解釋文中的例子,解釋每一行代碼在做什么,即便你對(duì)OpenGL甚至Visual C++一無所知,你也可以基本上讀懂這些例子,并且可以模仿這些例子寫一些自己的程序。所以如果你是一個(gè)初學(xué)者,我想本文會(huì)對(duì)你有很大幫助,但是如果你已經(jīng)是一個(gè)OpenGL編程高手,這篇文章對(duì)你來說就太簡(jiǎn)單了。 2.???????? 一個(gè)簡(jiǎn)單的例子 先編譯運(yùn)行一個(gè)簡(jiǎn)單的例子,這樣我們可以有一個(gè)直觀的印象。從這個(gè)例子我們可以看到OpenGL可以做什么,當(dāng)然這個(gè)例子只做了很簡(jiǎn)單的一件事——繪制一個(gè)彩色的三角形。除此以外,我們還可以看到典型的OpenGL程序結(jié)構(gòu)及openGL的運(yùn)行順序。 例1:本例在黑色的背景下繪制一個(gè)彩色的三角形。 #include <stdlib.h> #include <GL/glut.h> void background(void) { glClearColor(0.0,0.0,0.0,0.0);//設(shè)置背景顏色為黑色 } void myDisplay(void) { glClear(GL_COLOR_BUFFER_BIT);//buffer設(shè)置為顏色可寫 glBegin(GL_TRIANGLES);//開始畫三角形 glShadeModel(GL_SMOOTH);//設(shè)置為光滑明暗模式 glColor3f(1.0,0.0,0.0);//設(shè)置第一個(gè)頂點(diǎn)點(diǎn)為紅色 glVertex2f(-1.0,-1.0);//設(shè)置第一個(gè)頂點(diǎn)的坐標(biāo)為(-1.0,-1.0) glColor3f(0.0,1.0,0.0);//設(shè)置第二個(gè)頂點(diǎn)點(diǎn)為綠色 glVertex2f(0.0,-1.0);//設(shè)置第二個(gè)頂點(diǎn)的坐標(biāo)為(0.0,-1.0) glColor3f(0.0,0.0,1.0);//設(shè)置第三個(gè)頂點(diǎn)點(diǎn)為藍(lán)色 glVertex2f(-0.5,1.0);//設(shè)置第三個(gè)頂點(diǎn)的坐標(biāo)為(-0.5,1.0) glEnd();//三角形結(jié)束 glFlush();//強(qiáng)制OpenGL函數(shù)在有限時(shí)間內(nèi)運(yùn)行 } void myReshape(GLsizei w,GLsizei h) { glViewport(0,0,w,h);//設(shè)置視口 glMatrixMode(GL_PROJECTION);//指明當(dāng)前矩陣為GL_PROJECTION glLoadIdentity();//將當(dāng)前矩陣置換為單位陣 if(w <= h) gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定義二維正視投影矩陣 else gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5); glMatrixMode(GL_MODELVIEW);//指明當(dāng)前矩陣為GL_MODELVIEW } int main(int argc,char ** argv) { /*初始化*/ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(200,200); /*創(chuàng)建窗口*/ glutCreateWindow("Triangle"); /*繪制與顯示*/ background(); glutReshapeFunc(myReshape); glutDisplayFunc(myDisplay); /*進(jìn)入GLUT事件處理循環(huán)*/ glutMainLoop(); return(0); } 首先創(chuàng)建工程,其步驟如下: 1)創(chuàng)建一個(gè)Win32 Console Application。 2)鏈接OpenGL libraries。在Visual C++中先單擊Project,再單擊Settings,再找到Link單擊,最后在Object/library modules 的最前面加上OpenGL32.lib GLu32.lib GLaux.lib 3)單擊Project Settings中的C/C++標(biāo)簽,將Preprocessor definitions 中的_CONSOLE改為__WINDOWS。最后單擊OK。 現(xiàn)在你可以把下面的例子拷貝到工程中去,編譯運(yùn)行。你可以看到一個(gè)彩色的三角形。 我們先看看main函數(shù)。函數(shù)中以glut開頭的函數(shù)都包含在glut.h中。GLUT庫的函數(shù)主要執(zhí)行如處理多窗口繪制、處理回調(diào)驅(qū)動(dòng)事件、生成層疊式彈出菜單、繪制位圖字體和筆畫字體,以及各種窗口管理等任務(wù)。 l???????? glutInit用來初始化GLUT庫并同窗口系統(tǒng)對(duì)話協(xié)商。 l???????? glutInitDisplayMode用來確定所創(chuàng)建窗口的顯示模式。本例中的參數(shù)GLUT_SINGLE 指定單緩存窗口,這也是缺省模式,對(duì)應(yīng)的模式為GLUT_DOUBLE 雙緩存窗口。參數(shù)GLUT_RGB指定顏色RGBA模式,這也是缺省模式,對(duì)應(yīng)的模式為GLUT_INDEX 顏色索引模式窗口。 l???????? glutInitWindowSize 初始化窗口的大小,第一個(gè)參數(shù)為窗口的寬度,第二個(gè)參數(shù)為窗口的高度,以像素為單位。 l???????? glutInitWindowPosition 設(shè)置初始窗口的位置,第一個(gè)參數(shù)為窗口左上角x的坐標(biāo),第二個(gè)參數(shù)為窗口左上角y的坐標(biāo),以像素為單位。屏幕的左上角的坐標(biāo)為(0,0),橫坐標(biāo)向右逐漸增加,縱坐標(biāo)向下逐漸增加。 l???????? glutCreateWindow 創(chuàng)建頂層窗口,窗口的名字為擴(kuò)號(hào)中的參數(shù)。 l???????? background() 這是自己寫的函數(shù),設(shè)置背景。其實(shí)這個(gè)函數(shù)中的語句可以寫在display函數(shù)中,但為了使功能塊更加清晰,所以把背景這一部分單獨(dú)提出來。 l???????? glutReshapeFunc 注冊(cè)當(dāng)前窗口的形狀變化回調(diào)函數(shù)。當(dāng)改變窗口大小時(shí),該窗口的形狀改變回調(diào)函數(shù)將被調(diào)用。在此例中就是myReshape指定形狀變化函數(shù)。 l???????? glutDisplayFunc 注冊(cè)當(dāng)前窗口的顯示回調(diào)函數(shù)。當(dāng)一個(gè)窗口的圖像層需要重新繪制時(shí),GLUT將調(diào)用該窗口的的顯示回調(diào)函數(shù)。在此例中的mydisplay就是顯示回調(diào)函數(shù),顯示回調(diào)函數(shù)不帶任何參數(shù),它負(fù)責(zé)整個(gè)圖像層的繪制。我們的大部分工作將集中在這個(gè)函數(shù)中。 l???????? glutMainLoop 進(jìn)入GLUT事件處理循環(huán)。glutMainLoop函數(shù)在GLUT程序中最多只能調(diào)用一次,它一旦被調(diào)用就不再返回,并且調(diào)用注冊(cè)過的回調(diào)函數(shù)。所以這個(gè)函數(shù)必須放在注冊(cè)回調(diào)函數(shù)的后面,此例中為glutReshapeFunc, glutDisplayFunc。 現(xiàn)在我們對(duì)OpenGL程序的典型的程序結(jié)構(gòu)有了一個(gè)了解。首先初始化,包括對(duì)GLUT庫的初始化和對(duì)窗口的設(shè)置及顯示模式的設(shè)置。第二,創(chuàng)建窗口。第三,自己創(chuàng)作的核心部分。第四,glutMainLoop 進(jìn)入GLUT事件處理循環(huán)。 下面,我們轉(zhuǎn)到我們的創(chuàng)作核心。 background這個(gè)函數(shù)很簡(jiǎn)單,只有一行語句。glClearColor中的四個(gè)參數(shù)分別是紅、綠、藍(lán)和alpha值。這些值定義了窗口的顏色。這些值的范圍在[0,1]之間。缺省值均為0。你可以改變這些值,觀察背景色彩的變化。 myDisplay畫了一個(gè)彩色的三角形。 l???????? glClear 將buffers設(shè)置為預(yù)先設(shè)定的值。參數(shù)GL_COLOR_BUFFER_BIT表明現(xiàn)在可以向buffer中寫入顏色值。 l???????? glBegin和glEnd是一一對(duì)應(yīng)的。這兩個(gè)函數(shù)限制了一組或多組圖元的頂點(diǎn)定義。在這兩個(gè)函數(shù)中間就是你所繪制的由多個(gè)頂點(diǎn)組成的圖元。函數(shù)的參數(shù)表明了所繪制的圖元的類型。本例中的GL_TRIANGLES 表明所繪制的圖形為三角形。 l???????? glShadeModel選擇平坦或光滑漸變模式。GL_SMOOTH為缺省值,為光滑漸變模式,GL_FLAT為平坦?jié)u變模式。 l???????? glColor設(shè)置當(dāng)前顏色。后面跟的數(shù)字為參數(shù)個(gè)數(shù)。3表明有三個(gè)參數(shù),分別為紅、綠、藍(lán),4則多一個(gè)參數(shù)alpha。緊跟數(shù)字后面的字母表示數(shù)據(jù)類型。本例中的glColor3f表示三個(gè)參數(shù),數(shù)據(jù)類型為GLfloat。 l???????? glVertex指定頂點(diǎn)。同樣函數(shù)明中的數(shù)字表明參數(shù)個(gè)數(shù)。參數(shù)分別為x,y或x、y、z。緊跟數(shù)字后面的字母表示數(shù)據(jù)類型。本例中g(shù)lVertex2f表明兩個(gè)參數(shù),數(shù)據(jù)類型為GLfloat。窗口的中心為原心,坐標(biāo)為(0,0,0)。橫坐標(biāo)向左為負(fù),向右為正;縱坐標(biāo)向上為正,向下為負(fù);z坐標(biāo)向屏幕里為負(fù),屏幕外為正,坐標(biāo)系符合右手定則。 現(xiàn)在你將main函數(shù)中的glutReshapeFunc(myReshape); 注釋掉,任意改變?nèi)切雾旤c(diǎn)的坐標(biāo)你會(huì)發(fā)現(xiàn)窗口的最左邊,最右邊的x值分別為-1和1,而窗口的最上端,最下端的y值分別為1和-1。由此可見glVertex中坐標(biāo)的值實(shí)際上是和窗口的大小成倍數(shù)的關(guān)系。好了,現(xiàn)在恢復(fù)原來的程序。 l???????? glFlush迫使OpenGL函數(shù)在有限時(shí)間里運(yùn)行。glFlush清空所有buffer,使所有發(fā)出的命令能在規(guī)定的時(shí)間內(nèi)運(yùn)行。一定不能忘記這一條語句。只有加了這一句,前面的命令才能執(zhí)行。 myReshape 改變窗口的大小。 l???????? glViewport(Glint x,Glint y,GLsizei width,GLsizei height)設(shè)置視口。視口是一個(gè)矩形,x,y為視口左下角的坐標(biāo),以像素為單位,缺省值為(0,0)。width和height分別為視口的寬和高。OpenGl? context第一次貼到窗口上時(shí)width和height分別設(shè)置成窗口的大小。 l???????? glMatrixMode 指明哪一個(gè)矩陣為當(dāng)前矩陣。本例中GL_PROJECTION指明投影矩陣堆棧為隨后的矩陣操作的目標(biāo)。GL_MODELVIEW指明模型視景矩陣。
l???????? glLoadIdentity將當(dāng)前矩陣置換為單位陣。
l???????? gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)定義二維正視投影矩陣。left,right分別設(shè)置左右垂直切平面的坐標(biāo),bottom,top分別設(shè)置上下垂直切平面的坐標(biāo)。
現(xiàn)在你可能對(duì)這幾個(gè)參數(shù)的意義還不是很清楚。我們現(xiàn)在將myReshape 函數(shù)glLoadIdentity();后面所有的語句注釋掉。加上gluOrtho2D(-1.5,1.5,-1.5,1.5);改變?nèi)切偷淖鴺?biāo)及gluOrtho2D中的數(shù)值,你就可以清楚的理解gluOrtho2D中數(shù)值的含義。
現(xiàn)在,你應(yīng)該大致了解OpenGL到底是怎么一回事。通過這一節(jié)的學(xué)習(xí)我們知道怎樣使用顏色及繪制幾何圖形及物體的最基本的函數(shù),更多的函數(shù)你可以在網(wǎng)上或有關(guān)書中查到。下一節(jié)我們繼續(xù)講一下顏色的使用。
l???????? glLoadIdentity將當(dāng)前矩陣置換為單位陣。
l???????? gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)定義二維正視投影矩陣。left,right分別設(shè)置左右垂直切平面的坐標(biāo),bottom,top分別設(shè)置上下垂直切平面的坐標(biāo)。
現(xiàn)在你可能對(duì)這幾個(gè)參數(shù)的意義還不是很清楚。我們現(xiàn)在將myReshape 函數(shù)glLoadIdentity();后面所有的語句注釋掉。加上gluOrtho2D(-1.5,1.5,-1.5,1.5);改變?nèi)切偷淖鴺?biāo)及gluOrtho2D中的數(shù)值,你就可以清楚的理解gluOrtho2D中數(shù)值的含義。
現(xiàn)在,你應(yīng)該大致了解OpenGL到底是怎么一回事。通過這一節(jié)的學(xué)習(xí)我們知道怎樣使用顏色及繪制幾何圖形及物體的最基本的函數(shù),更多的函數(shù)你可以在網(wǎng)上或有關(guān)書中查到。下一節(jié)我們繼續(xù)講一下顏色的使用。
總結(jié)
以上是生活随笔為你收集整理的OpenGL编程轻松入门(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 沧海桑田是什么意思(沧海桑田下一句是什么
- 下一篇: 村党支部书记主要事迹材料3篇