




已閱讀5頁,還剩58頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
2020/5/17,華中科技大學計算機學院李國寬,1,1、OpenGL簡介OpenGL(OpenGraphicsLibrary,開放圖形庫),是一個二維/三維的計算機圖形和模型庫,它源于SGI(SiliconGraphicsinc.)公司為其圖形工作站開發(fā)的IRISGL,在跨平臺移植過程中發(fā)展成為OpenGL。目前,OpenGL已成為開放的國際圖形標準。,一、OpenGL框架,2020/5/17,2,OpenGL的功能:模型繪制繪制點、線和多邊形,構(gòu)造三維模型。模型觀察建立變換(坐標變換,投影變換,視窗變換)。顏色模式的指定:RGBA模式和顏色索引模式光照應用圖象效果增強:反走樣、混合和霧化位圖和圖象處理紋理映射實時動畫:雙緩存技術(doublebuffer)交互技術提供人機交互的接口。,OpenGL的特點從程序開發(fā)人員的角度來看,OpenGL是一組繪圖命令的API集合。利用這些API能夠方便地描述二維和三維幾何物體,并控制這些物體按某種方式繪制到顯示緩沖區(qū)中。OpenGL的API集提供了物體描述、平移、旋轉(zhuǎn)、縮放、光照、紋理、材質(zhì)、像素、位圖、文字、交互以及提高顯示性能等方面的功能,基本涵蓋了開發(fā)二、三維圖形程序所需的各個方面。與一般的圖形開發(fā)工具相比,OpenGL具有以下幾個突出特點:,(1)跨平臺特性OpenGL與硬件、窗口和操作系統(tǒng)是相互獨立的。為了構(gòu)成一個完整功能的圖形處理系統(tǒng),其設計實現(xiàn)共分5層:圖形硬件、操作系統(tǒng)、窗口系統(tǒng)、OpenGL和應用軟件。因而,OpenGL可以集成到各種標準窗口和操作系統(tǒng)中。例如,操作系統(tǒng)包括UNIX,WindowsNT,Windows95/98,DOS等;窗口系統(tǒng)包括XWindows,MicrosoftWindows等。OpenGL圖形函數(shù)定義獨立于任何程序設計語言,在各種編程語言中,如C,C+,F(xiàn)ORTRAIN,Ada和Java等,都可以調(diào)用OpenGL的庫函數(shù)。,(2)應用的廣泛性OpenGL是目前最主要的二、三維交互式圖形應用程序開發(fā)環(huán)境,已成為業(yè)界最受推薦的圖形應用編程接口。自從1992年發(fā)表以來,OpenGL已被廣泛地應用于CAD/CAM、三維動畫、數(shù)字圖像處理以及虛擬現(xiàn)實等領域,Kinetix公司的3DStudioMax就是突出的代表。無論是在PC機上,還是在工作站甚至是大型機和超級計算機上,OpenGL都能表現(xiàn)出它的高性能和強大威力。,(3)網(wǎng)絡透明性建立在客戶/服務器模型上的網(wǎng)絡透明性是OpenGL的固有特性,它允許一個運行在工作站上的進程在本機或通過網(wǎng)絡在遠程工作站上顯示圖形。利用這種性質(zhì)能夠均衡各工作站的工作負荷,共同承擔圖形應用任務。(4)高質(zhì)量和高性能無論是在CAD/CAM、三維動畫還是可視化仿真等領域,OpenGL高質(zhì)量和高效率的圖形生成能力都能得到充分的體現(xiàn)。在這些領域中,開發(fā)人員可以利用OpenGL制作出效果逼真的二、三維圖像來。,(5)出色的編程特性OpenGL在各種平臺上已有多年的應用實踐,加上嚴格的規(guī)范控制,因此OpenGL具有良好的穩(wěn)定性。OpenGL具有充分的獨立性與易使用性等。,2020/5/17,8,2、OpenGL的工作方式(1)體系結(jié)構(gòu)一個完整的窗口系統(tǒng)的OpenGL圖形處理系統(tǒng)的結(jié)構(gòu)如右圖所示:最底層為圖形硬件,第二層為操作系統(tǒng),第三層為窗口系統(tǒng),第四層為OpenGL,最上面的層為應用軟件。,2020/5/17,9,(2)OpenGL的流水線當應用程序進行OpenGLAPI函數(shù)調(diào)用時,OpenGL命令將被放在一個命令緩沖區(qū)中,這樣,命令緩沖區(qū)中包含了大量的命令、頂點數(shù)據(jù)和紋理數(shù)據(jù)。當這個緩沖區(qū)被清空時,緩沖區(qū)中的命令和數(shù)據(jù)都將傳遞給流水線的下一個階段。,2020/5/17,10,(3)OpenGL狀態(tài)機制OpenGL的工作方式是一種狀態(tài)機制,它可以進行各種狀態(tài)或模式設置,這些狀態(tài)或模式在重新改變它們之前一直有效。狀態(tài)變量可以通過glEnable()、glDisable()這兩個函數(shù)來設置成有效或無效狀態(tài)。另外可以用下列四個函數(shù)來獲取某個狀態(tài)變量的值:glGetBooleanv()、glGetDoublev()、glGetFloatv()和glGetIntegerv()。,2020/5/17,11,3、OpenGL的組成OpenGL是一種API,包括了多個圖形函數(shù),主要由以下函數(shù)庫組成。(1)OpenGL核心庫:gl(2)OpenGL實用程序庫:glu(3)OpenGL編程輔助庫:aux(4)OpenGL實用程序工具包(OpenGLutilitytoolkit,GLUT):glut(5)Windows專用庫:wgl(6)Win32API函數(shù)庫,2020/5/17,12,4、OpenGL中的數(shù)據(jù)類型,2020/5/17,13,5、函數(shù)命名約定OpenGL函數(shù)都遵循一個命名約定,即采用以下格式:例如函數(shù)glColor3f(),gl表示這個函數(shù)來自庫gl.h,color表示該函數(shù)用于顏色設定,3f表示這個函數(shù)采用了三個浮點數(shù)參數(shù)。,2020/5/17,14,6、OpenGL中的顏色在OpenGL中,一種顏色用紅、綠、藍成分的混合來表示,每種成分的值范圍是0.0到1.0。,OpenGL初步編程,在Windows下開發(fā)和創(chuàng)建一個OpenGL程序的基本步驟:第一步,選擇一個編譯環(huán)境,如VC+第二步,安裝GLUT工具包第三步,建立一個OpenGL工程第四步,編譯連接第五步,執(zhí)行程序,OpenGL初步編程,OpenGL庫和頭文件:動態(tài)庫:opengl32.dllglu32.dllglut32.dll放入windowssystem32目錄下靜態(tài)庫:opengl32.libglu32.libglut32.lib放入VC安裝目錄的LIB目錄下頭文件:gl.hglu.hglut.h放入VC安裝目錄的IncludeGL文件夾下,程序清單1.1:在窗口內(nèi)繪制一個矩形/GLRect.c#include#include#include#include/函數(shù)RenderScene用于在窗口中繪制需要的圖形voidRenderScene(void)/用當前清除色清除顏色緩沖區(qū),即設定窗口的背景色glClear(GL_COLOR_BUFFER_BIT);/設置當前繪圖使用的RGB顏色glColor3f(1.0f,0.0f,0.0f);/使用當前顏色繪制一個填充的矩形glRectf(100.0f,150.0f,150.0f,100.0f);/刷新OpenGL命令隊列glFlush();,/函數(shù)ChangeSize是窗口大小改變時調(diào)用的登記函數(shù)voidChangeSize(GLsizeiw,GLsizeih)if(h=0)h=1;/設置視區(qū)尺寸glViewport(0,0,w,h);/重置坐標系統(tǒng),使投影變換復位glMatrixMode(GL_PROJECTION);glLoadIdentity();/建立修剪空間的范圍if(w=h)glOrtho(0.0f,250.0f,0.0f,250.0f*h/w,1.0f,-1.0f);elseglOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0f,-1.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();/函數(shù)SetupRC用于初始化,常用來設置場景渲染狀態(tài)voidSetupRC(void)/設置窗口的清除色為白色glClearColor(1.0f,1.0f,1.0f,1.0f);,voidmain(void)/初始化GLUT庫OpenGL窗口的顯示模式glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);/創(chuàng)建一個名為GLRect的窗口glutCreateWindow(GLRect);/設置當前窗口的顯示回調(diào)函數(shù)和窗口再整形回調(diào)函數(shù)glutDisplayFunc(RenderScene);glutReshapeFunc(ChangeSize);SetupRC();/啟動主GLUT事件處理循環(huán)glutMainLoop();,GLRect程序運行結(jié)果,2020/5/17,21,1、畫點、線和面glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(10.0f,10.0f,10.0f);glEnd();計算機中的圖元只是把一組頂點或頂點列表解釋為屏幕上繪制的某些形狀,而頂點是用函數(shù)glVertex3f來定義,該函數(shù)中的參數(shù)指明定義點的x、y和z坐標。,二、用OpenGL繪圖,2020/5/17,22,2020/5/17,23,(1)點的大小voidglPointSize(GLfloatsize);GLfloatsizes2;/保存繪制點的尺寸范圍GLfloatstep;/保存繪制點尺寸的步長glGetFloarv(GL_POINT_SIZE_RANGE,sizes);glGetFloatv(GL_POINT_SIZE_GRANULARITY,,2020/5/17,30,5、多邊形構(gòu)造規(guī)則(1)所有多邊形都必須是平面的。(2)第二條規(guī)則是多邊形的邊緣決不能相交,而且多邊形必須是凸的。解決:對于非凸多邊形,可以把它分割成幾個凸多邊形(通常是三角形),再將它繪制出來。問題:輪廓圖形狀態(tài)會看到組成大表面的所有小三角形。處理OpenGL提供了一個特殊標記來處理這些邊緣,稱為邊緣標記。glEdgeFlag(True)glEdgeFlag(False),1、OpenGL中的變換(1)視圖變換:指定觀察者或攝影機的位置;(2)模型變換:在場景中移動對象;(3)模型視圖變換:描述視圖變換與模型變換的對偶性;(4)投影變換:對視見空間進行修剪和改變大??;(5)視見區(qū)變換:對窗口的最終輸出進行縮放;,三、圖形的變換,2、模型視圖矩陣(1)平移voidglTranslated(f)(GLdoublex,GLdoubley,GLdoublez);(2)旋轉(zhuǎn)voidglRotated(f)(GLdoubleangle,GLdoublex,GLdoubley,GLdoublez);(3)比例voidglScaled(f)(GLdoublex,GLdoubley,GLdoublez);,矩陣的操作glMatrixMode(GLenummode);參數(shù)mode用于確定將哪個矩陣堆棧用于矩陣操作。GL_MODELVIEW:模型視圖矩陣堆棧GL_PROJECTION:投影矩陣堆棧GL_TEXTURE:紋理矩陣堆棧,3、單位矩陣glTranslatef(10.0f,0.0f,0.0f);glutSolidSphere(1.0f,15,15);glTranslatef(0.0f,10.0f,0.0f);glutSolidSphere(1.0f,15,15);,glMatrixMode(GL_MODELVIEW);glLoadIdentity();,4、矩陣堆棧OpenGL為模型視圖矩陣和投影矩陣各維護著一個“矩陣堆?!保梢园旬斍熬仃噳旱蕉褩V斜4嫠?,然后對當前矩陣進行修改。把矩陣彈出堆棧即可恢復。使用的函數(shù)如下:voidglPushMatrix(void);voidglPopMatrix(void);,5、投影變換OpenGL中只提供了兩種投影方式,一種是平行投影(正射投影),另一種是透視投影。在投影變換之前必須指定當前處理的是投影變換矩陣:glMAtrixMode(GL_PROJECTION);glLoadIdentity();,(1)平行投影平行投影,它的視景體是一個矩形的平行管道,也就是一個長方體,其特點是無論物體距離相機多遠,投影后的物體大小尺寸不變。voidglOrtho(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop,GLdoublenear,GLdoublefar);這個函數(shù)的操作是創(chuàng)建一個正射投影矩陣,并且用這個矩陣乘以當前矩陣。,voidgluOrtho2D(GLdoubleleft,GLdoubleright,GLdoublebottom,GLdoubletop);它是一個特殊的正射投影函數(shù),主要用于二維圖像到二維屏幕上的投影。它的near和far缺省值分別為-1.0和1.0,所有二維物體的Z坐標都為0.0。因此它的裁剪面是一個左下角點為(left,bottom)、右上角點為(right,top)的矩形。,(2)透視投影voidglFrustum(GLdoubleleft,GLdoubleRight,GLdoublebottom,GLdoubletop,GLdoublenear,GLdoublefar);此函數(shù)創(chuàng)建一個透視投影矩陣,并且用這個矩陣乘以當前矩陣。它的參數(shù)只定義近裁剪平面的左下角點和右上角點的三維空間坐標,即(left,bottom,-near)和(right,top,-near);最后一個參數(shù)far是遠裁剪平面的Z負值,其左下角點和右上角點空間坐標由函數(shù)根據(jù)透視投影原理自動生成。,voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar);它也創(chuàng)建一個對稱透視視景體,但它的參數(shù)定義于前面的不同,其操作是創(chuàng)建一個對稱的透視投影矩陣,并且用這個矩陣乘以當前矩陣。參數(shù)fovy定義視野在X-Z平面(垂直方向上的可見區(qū)域)的角度,范圍是0.0,180.0;參數(shù)aspect是投影平面的縱橫比(寬度與高度的比值);參數(shù)zNear和Far分別是遠近裁剪面沿Z負軸到視點的距離。,6、高級矩陣處理glfloatm=1.0f,0.0f,3.0f,0.0f,0.0f,1.0f,0.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,0.0f,1.0f,;glMatrixMode(GL_MODELVIEW);glLoadMatrixf(m);,當光照射到一個物體表面上時,會出現(xiàn)三種情形。首先,光可以通過物體表面向空間反射,產(chǎn)生反射光。其次,對于透明體,光可以穿透該物體并從另一端射出,產(chǎn)生透射光。最后,部分光將被物體表面吸收而轉(zhuǎn)換成熱。在上述三部分光中,僅僅是透射光和反射光能夠進入人眼產(chǎn)生視覺效果。,四、光照處理,(1)環(huán)境光(AmbientLight)環(huán)境光不來自于任何特殊的方向,他有光源,但是被周圍的房間或場景多次反射,以致于變得沒有方向。被環(huán)境光照射的物體表面的各個方向都均等受光。(2)散射光(DiffuseLight)光來自某個方向,被物體表面均勻地反射。光是被均勻反射回去的,它直射的物體表面比從某個角度照射過來時要亮。,(3)鏡面光(SpecularLight)鏡面光也有方向性,但被強烈地反射到另一特定的方向。高亮度的鏡面光能夠在被照射的物體表面上產(chǎn)生稱之為亮斑的亮點。任何一個光源都是由環(huán)境光、散射光和鏡面光三種光照成分組成,各成分的定義是由RGBA值定義的。,5.材質(zhì)OpenGL用材料對光的紅、綠、藍三原色的反射率來近似定義材料的顏色。象光源一樣,材料顏色也分成環(huán)境、漫反射和鏡面反射成分,它們決定了材料對環(huán)境光、漫反射光和鏡面反射光的反射程度。在進行光照計算時,材料對環(huán)境光的反射率與每個進入光源的環(huán)境光結(jié)合,對漫反射光的反射率與每個進入光源的漫反射光結(jié)合,對鏡面光的反射率與每個進入光源的鏡面反射光結(jié)合。,材質(zhì)的顏色實際決定了反射光與入射光的百分比率:若OpenGL的光源顏色為(LR、LG、LB),材質(zhì)顏色屬性為(MR、MG、MB)。那么,最終到達眼睛的光的顏色為(LR*MR、LG*MG、LB*MB)三種光照成分的RGBA值疊加就形成了物體最終的顏色。當任何一種顏色成分大于1.0,就用1.0計算。,6.加入光照(1)glEnable(GL_LIGHTING)指定OpenGL可以利用材質(zhì)屬性和光照參數(shù)決定場景中每個頂點的顏色。,(2)glLightModelfv(f,i,iv)(Glenumpname,constGLfloat*param)指定光照模型GL_LIGHT_MODEL_AMBIENT:設置環(huán)境光GL_LIGHT_MODEL_LOCAL_VIEWER:定義視點,0表示鏡面反射角度認為視線方向平行于z軸負向,否則鏡面反射從視點坐標系的原點來計算。GL_LIGHT_MODEL_TWO_SIDE:啟用雙面關照,0.0時表示只有多邊形表面的正面進行光照計算,否則正反兩面都進行光照計算。,(3)glMaterialfv(GLenumface,GLenumpname,constGLfloat*params)Face參數(shù):GL_FRONT;GL_BACK;GL_FRONT_AND_BACK。Pname參數(shù):GL_AMBIENT:材質(zhì)環(huán)境反射RGBA值。GL_DIFFUSE:材質(zhì)漫反射RGBA值。GL_SPECULAR:材質(zhì)鏡面反射RGBA值。GL_SHININESS:材質(zhì)的RGBA鏡面指數(shù)。,(4)glEnable(GL_COLOR_MATERIAL)啟用顏色跟蹤法,此時可以通過glColor設置材質(zhì)屬性。(5)glColorMaterial(Glenumface,Glenummode)mode:指定哪個材質(zhì)屬性能夠遵循當前的顏色。,GL_EMISSION;GL_AMBIENT;GL_DIFFUSE;GL_SPECULAR;GL_AMBIENT_AND_DIFFUSE。,7.使用點光源OpenGL支持8種獨立光源,它們可以放置在場景中的任意位置,也可放在視見空間之外。當將光源放在無窮遠處就可以得到平行的光線。光源發(fā)射光線射到多邊形的表面,與平面成角度A,在以角度B反射進入觀察者,通過這些角度可以計算光線照射的多邊形表面的顏色。OpenGL有意讓計算的位置就是多邊形的頂點。通過計算各個頂點的顏色,再在各個頂點間進行光滑著色。,(1)法線矢量從假想的平面(或者是多邊形)上的一個頂點引出來的一條垂直向上的線稱為法線矢量。glNormal3f(GLfloatx,GLfloaty,GLfloatz)指定法線矢量。OpenGL最后都將表面法線轉(zhuǎn)化成單位法線,對于光照計算,所有的法線矢量都必須歸一化。glEnable(GL_NORMALIZE)glEnable(GL_RESCALE_NORMALS)法線矢量的計算,(2)設置光源參數(shù)glLightf(GLenumlight,GLenumpname,GLenumparam)light:光源編號,pname:指定光源參數(shù)類型GL_AMBIENT:光照的環(huán)境RGBA濃度。GL_DIFFUSE:光照的漫射RGBA濃度。GL_SPECULAR:光照的鏡面RGBA濃度。,(3)鏡面光處理使用glLightfv函數(shù)在光源中加入鏡面光成分,為了出現(xiàn)鏡面光效果,還要在材質(zhì)屬性中增加鏡面成分。鏡面指數(shù):glMateriali(GL_FRONT,GL_SHININESS,128);GL_SHININESS屬性設置材質(zhì)的鏡面指數(shù),它說明如何確定鏡面關亮斑的大小和聚焦程度。,(4)光的衰減真實的光,離光源越遠則光強越小。OpenGL的光衰減是通過光源的發(fā)光量乘以衰減因子計算出來的。缺省狀態(tài)下,常數(shù)衰減因子是(1.0,0.0,0.0)。用戶也可以自己定義這些值,如:glLightf(GL_LIGHT0,GL_CONSTANT_ATTENUATION,2.0);glLightf(GL_LIGHT0,GL_LINEAR_ATTENUATION,1.0);glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION,0.5);注意:環(huán)境光、漫反射光和鏡面光的強度都衰減,只有輻射光和全局環(huán)境光的強度不衰減。,(5)聚光和多光源定位光源可以定義成聚光燈形式,即將光的形狀限制在一個圓錐內(nèi)。OpenGL中聚光的定義有以下幾步:a)定義聚光源位置。因為聚光源也是定向光源,所以他的位置同一般定向光一樣。如:GLfloatlight_pos=1.0,1.0,1.0,1.0;glLightfv(GL_LIGHT0,LIGHT_POSITION,light_pos);light_pos參數(shù)的最后一個分量為0,則光源為方向光源,分量為1,則光源為平行于負z軸的方向光源。,b)定義聚光截止角。參數(shù)GL_SPOT_CUTOFF給定光錐的軸與中心線的夾角,也可說成是光錐頂角的一半。缺省時,這個參數(shù)為180.0,即頂角為360度,光向所有的方向發(fā)射,因此聚光關閉。一般在聚光啟動情況下,聚光截止角限制在0.0,90.0之間,如下面一行代碼設置截止角為45度:glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 積極參與志愿活動回饋社會計劃
- 制定職業(yè)生涯的長期規(guī)劃計劃
- 法學概論考試的互動學習模式與試題及答案探討
- 前臺文員與其他部門的協(xié)調(diào)溝通計劃
- 信息技術市場的變化與機遇測試試題及答案
- 網(wǎng)絡管理員考試能力評估試題及答案
- 品牌預期與消費者行為的關聯(lián)計劃
- 提升項目交付能力的策略計劃
- 2024年吉林省生態(tài)環(huán)境廳下屬事業(yè)單位真題
- 2024年湖北省交通運輸廳下屬事業(yè)單位真題
- 《大學生創(chuàng)新創(chuàng)業(yè)》課件-第九章 創(chuàng)業(yè)融資
- 包場合同范例
- 義務教育學校辦學質(zhì)量自評報告
- 【MOOC】心理學與生活-南京大學 中國大學慕課MOOC答案
- 華中師范大學第一附中2025屆高考沖刺押題(最后一卷)數(shù)學試卷含解析
- 《電力機車構(gòu)造(第2版)》課件 任務三 HXD1型電力機車車體設備布置認知
- (完整版)北郵英語統(tǒng)考題庫
- 殯儀服務員職業(yè)培訓試題和答案
- 房屋買賣合同范本模版模板
- 第五課 在和睦家庭中成長 說課稿-2024-2025學年高中政治統(tǒng)編版選擇性必修二法律與生活
- 農(nóng)業(yè)昆蟲學-形考測試一-國開(ZJ)-參考資料
評論
0/150
提交評論