資源描述:
《opengl多視口》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、提要OpenGL視口(Viewport)可以看作是窗口中OpenGL的繪制輸出區(qū)域,可以通過一條簡(jiǎn)單的glViewport命令設(shè)置。一般的OpenGL教程都是單視口,即整個(gè)窗口為惟一的一個(gè)視口,Nehe的OpenGL教程是我最早見到涉及多視口的。與單視口程序相比,多視口程序的變化主要是:(一)多視口程序不能在窗口resize/reshape時(shí)直接調(diào)用glViewport,而應(yīng)該在此時(shí)記下窗口大小,然后在繪制場(chǎng)景時(shí)多次調(diào)用glViewport設(shè)置每個(gè)視口的位置和大??;(二)對(duì)于每個(gè)視口,應(yīng)分別調(diào)用glMatrixMode(GL_PROJECTION)和glMatrixMod
2、e(GL_MODELVIEW)以設(shè)置投影和建模矩陣。多視口的最常見的應(yīng)用,就是3DMax中的多視口建模,每一個(gè)觀察口都從不同的方向去觀察模型,從而很方便地去獲取模型當(dāng)前的狀態(tài)。還有就是賽車游戲中的后視鏡等等.具體實(shí)現(xiàn)的思路就是對(duì)每個(gè)視口進(jìn)行獨(dú)立的渲染。函數(shù)解析下面是需要調(diào)用到的一些OpenGL的函數(shù)。glLoadIdentity()重置當(dāng)前指定的矩陣為單位矩陣.glViewport(GLintx,GLinty,GLsizeiwidth,GLsizeiheight)在窗口中定義一個(gè)像素矩形,最終將圖像映射到這個(gè)矩形中。voidgluOrtho2D(GLdoubleleft,
3、GLdoubleright,GLdoublebottom,GLdoubletop)建立了一個(gè)可視的二位平面區(qū)域。這個(gè)和用glOrtho函數(shù)的當(dāng)near=0,far=1時(shí)效果是一樣。voidgluPerspective(GLdoublefovy,GLdoubleaspect,GLdoublezNear,GLdoublezFar)這個(gè)函數(shù)指定了觀察的視景體(frustum為錐臺(tái)的意思,通常譯為視景體)在世界坐標(biāo)系中的具體大小,一般而言,其中的參數(shù)aspect應(yīng)該與窗口的寬高比大小相同。voidglScissor(GLintx,GLinty,GLsizeiwidth,GLsiz
4、eiheight)設(shè)置一個(gè)裁剪窗口,前兩個(gè)參數(shù)為窗口左下角位置,后兩個(gè)參數(shù)是窗口的寬度和高度。使用前一定要glEnable(GL_SCISSOR_TEST);代碼實(shí)現(xiàn)實(shí)現(xiàn)一:voidrenderGL()?{???glClear(GL_COLOR_BUFFER_BIT);???glLoadIdentity();?????????????????//重置模型觀察矩陣????for(intloop=0;loop<4;loop++)????????//循環(huán)繪制4個(gè)視口???{?????if(loop==0)??????????????????//繪制左上角的視口?????{???
5、????//設(shè)置視口區(qū)域???????glViewport(0,window_height/2,window_width/2,window_height/2);???????glMatrixMode(GL_PROJECTION);???????glLoadIdentity();???????gluOrtho2D(0,window_width/2,window_height/2,0);?????}?????if(loop==1)??????????????????//繪制右上角視口?????{????????glViewport(window_width/2,window_
6、height/2,window_width/2,window_height/2);???????glMatrixMode(GL_PROJECTION);???????glLoadIdentity();???????gluPerspective(45.0,1.0f,0.1f,500.0);?????}?????if(loop==2)??????????????????//繪制右下角視口?????{???????glViewport(window_width/2,0,window_width/2,window_height/2);???????glMatrixMode(GL_
7、PROJECTION);???????glLoadIdentity();???????gluPerspective(45.0,1.0f,0.1f,500.0);?????}?????if(loop==3)??????????????????//繪制左下角視口?????{???????glViewport(0,0,window_width/2,window_height/2);???????glMatrixMode(GL_PROJECTION);???????glLoadIdentity();???????gluPerspect