日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL编程轻松入门(一)

發(fā)布時(shí)間:2023/12/31 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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背景簡介 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ù)很少,大多只是對(duì)其中部分做出修改和完善。隨著DirectX的不斷發(fā)展和完善,OpenGL的優(yōu)勢逐漸喪失,至今雖然已有3Dlabs提倡開發(fā)的2.0版本面世,在其中加入了很多類似于DirectX中可編程單元的設(shè)計(jì),但廠商的用戶認(rèn)知程度并不高,未來的OpenGL發(fā)展前景迷茫。 但是OpenGL具有許多優(yōu)勢,這些優(yōu)勢可以為硬件及軟件研發(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ì)你來說就太簡單了。 2.???????? 一個(gè)簡單的例子 先編譯運(yùn)行一個(gè)簡單的例子,這樣我們可以有一個(gè)直觀的印象。從這個(gè)例子我們可以看到OpenGL可以做什么,當(dāng)然這個(gè)例子只做了很簡單的一件事——繪制一個(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ù)很簡單,只有一行語句。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ù)講一下顏色的使用。

總結(jié)

以上是生活随笔為你收集整理的OpenGL编程轻松入门(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 夜夜操网址 | 亚洲视频国产精品 | 久久久久久久久久久久久女国产乱 | 少妇一级淫片日本 | 亚洲精品无码久久久 | 鲁丝一区二区三区 | 麻豆一区在线 | 日韩欧美视频一区二区三区 | 91视频社区 | 亚洲美女精品 | 欧美小视频在线 | 婷婷六月天 | 奇米777色 | 人妻精品久久久久中文字幕 | 中文无码av一区二区三区 | 中文字幕3区 | 古装做爰无遮挡三级视频 | 一本色道久久综合亚洲精品按摩 | 日本五十路在线 | 女性爱爱视频 | 欧美日韩另类一区 | 精品人妻一区二区三区视频 | 免费黄色网址在线观看 | 99精品视频在线播放免费 | 亚洲女优在线播放 | 娇小的粉嫩xxx极品 国产精品人人爽人人爽 | 三上悠亚激情av一区二区三区 | 亚洲区小说区图片区 | 很黄很黄的网站 | 久久久久xxxx | 国产一二区视频 | 三级黄色片免费 | 亚洲淫片 | 91久久亚洲 | 国产婷婷在线视频 | 国产浮力第一页 | 日韩视频一区 | 涩涩久久| 久久女同| 老司机狠狠爱 | 国产精品黄色 | 国产视频欧美 | 伊人手机在线视频 | 捆绑裸体绳奴bdsm亚洲 | 中文字幕天堂在线 | 亚洲免费成人av | 国产成人啪一区二区 | 欧美成人一区二区视频 | 97久久久久久久 | 日韩中文字幕免费在线观看 | 久久久成人精品一区二区三区 | 色啪网站 | 一级黄色特级片 | 青青草国产在线观看 | 亚洲三级免费 | 美女午夜视频 | 中文字幕一区二区三区在线播放 | 亚洲福利在线播放 | 永久av在线免费观看 | 国产三级全黄 | 欧美xxxxbbbb| 免费日韩毛片 | 国产乱妇无码大片在线观看 | 91爱啪啪| 在线免费看av的网站 | 国产又粗又大又黄 | 久操超碰 | 精品一区李梓熙捆绑 | 麻豆黄色片 | 国产福利一区二区三区 | 大学生一级一片全黄 | 日韩成人精品一区二区三区 | 亚洲爆乳无码一区二区三区 | 午夜少妇 | 亚洲国产精品女人久久久 | 日本电车痴汉 | 精品福利一区 | 国产cao| 涩涩涩涩av | 欧美日韩一区二区精品 | 免费无码不卡视频在线观看 | 日韩精品成人av | 四季av中文字幕 | 黄色小视频在线观看 | 视频一区欧美 | 国产一区二区视频在线观看 | 国产一卡二卡在线播放 | 超碰在线公开免费 | 秋霞精品一区二区三区 | 99久久99久久精品国产片果冻 | 免费毛片a | 色亚洲影院 | 内射中出日韩无国产剧情 | 一区二区三区激情视频 | 一区在线观看视频 | 国产一页| 观看免费av | 性欧美视频在线观看 | 最新地址在线观看 |