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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

OpenGL编程指南4:双缓冲实现运行

發(fā)布時(shí)間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL编程指南4:双缓冲实现运行 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.前言

繪制一個(gè)旋轉(zhuǎn)的方塊,主要為了說明glutSwapBuffers()函數(shù)的用法。 同時(shí)也為了學(xué)習(xí)如何使用GLUT控制輸入設(shè)備,并打開或關(guān)閉空閑處理函數(shù)。

2.OpenGL編程及程序剖析

/*****************************************************************Rendering a rotating square,display how to use glutSwapBuffers()*Author:Ziheng H. Shen @ Graduate School of Tsinghua Univ.****************************************************************/ #include <vgl.h>static GLfloat spin = 0.0;void init(void) {glClearColor(0.0,0.0,0.0,0.0); //清空當(dāng)前所偶有顏色glShadeModel(GL_FLAT); //設(shè)置著色模式 } void display(void) {glClear(GL_COLOR_BUFFER_BIT); //清除viewport的緩沖區(qū)glPushMatrix();//將當(dāng)前矩陣保存入堆棧頂(保存當(dāng)前矩陣)glRotatef(spin,0.0,0.0,1.0);glColor3f(1.0,0.0,0.0);glRectf(-25.0,-25.0,25.0,25.0);glPopMatrix();glutSwapBuffers();//實(shí)現(xiàn)雙緩沖技術(shù),交換兩個(gè)緩沖區(qū)指針。 } void spinDisplay(void) {spin = spin + 2.0;if(spin > 360.0)spin = spin - 360.0;glutPostRedisplay(); // 標(biāo)記當(dāng)前窗口需要重新繪制 } void reshape(int w,int h) {glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION); //指定哪一個(gè)矩陣是當(dāng)前矩陣glLoadIdentity(); //重置當(dāng)前指定的矩陣為單位矩陣glOrtho(-50,50,-50,50,-1,1); //將當(dāng)前的可視空間設(shè)置為正投影空間glMatrixMode(GL_MODELVIEW);glLoadIdentity(); } /**************************************************/ void mouse(int button, int state, int x,int y) {switch (button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(spinDisplay);//全局的回調(diào)函數(shù),響應(yīng)鼠標(biāo)左鍵操作,更新圖像旋轉(zhuǎn)之后結(jié)果break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(NULL); //全局回調(diào)函數(shù),響應(yīng)鼠標(biāo)中鍵操作break;default:break;} } /**Request double buffer display mode.*Register mouse input callback functions.*/ int main(int argc, char** argv) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(250,250);glutInitWindowPosition(0,0);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape); //窗口改變的時(shí)候調(diào)用的函數(shù)glutMouseFunc(mouse); //響應(yīng)鼠標(biāo)事件glutMainLoop();return 0; }輸出結(jié)果:

3.函數(shù)解析

3.1?glClearColor

通過glClear使用紅,綠,藍(lán)以及AFA值來清除顏色緩沖區(qū)的,并且都被歸一化在(0,1)之間的值,其實(shí)就是清空當(dāng)前的所有顏色。

3.2?glShadeModel

void glShadeModel ( GLenum mode)是OpenGL1.0提供的接口。作用是設(shè)置著色模式。參數(shù)mode可以是GL_SMOOTH(默認(rèn)值)或GL_FLAT。采用恒定著色時(shí)(即GL_FLAT),使用圖元中某個(gè)頂點(diǎn)的顏色來渲染整個(gè)圖元。在使用光滑著色時(shí)(即GL_SMOOTH),獨(dú)立的處理圖元中各個(gè)頂點(diǎn)的顏色。對于線段圖元,線段上各點(diǎn)的顏色將根據(jù)兩個(gè)頂點(diǎn)的顏色通過差值得到。對于多邊形圖元,多邊形內(nèi)部區(qū)域的顏色將根據(jù)所有頂點(diǎn)的顏色差值得到。

3.3?glClear

void glClear(GLbitfield mask);
參數(shù)說明:
GLbitfield:可以使用 | 運(yùn)算符組合不同的緩沖標(biāo)志位,表明需要清除的緩沖,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除顏色緩沖以及深度緩沖,可以使用以下標(biāo)志位
GL_COLOR_BUFFER_BIT: ? 當(dāng)前可寫的顏色緩沖
GL_DEPTH_BUFFER_BIT: ? 深度緩沖
GL_ACCUM_BUFFER_BIT: ? 累積緩沖
GL_STENCIL_BUFFER_BIT: 模板緩沖

3.4?glPushMatrix &&?glPopMatrix

glPushMatrix(),glPopMatrix()這兩個(gè)函數(shù)是搭配使用的,中間放置幾何變換。glPushMatrix()的作用是把矩陣壓入棧中保存起來,留著以后再用,就好象把子彈壓入槍膛一樣。但這個(gè)壓子彈不是簡單滴丫,它是把和彈夾的最頂?shù)哪穷w子彈一模一樣的子彈壓入彈夾。假如說彈夾的子彈從下往上裝的子彈各不相同,依次為A1型子彈,B2型子彈,C3型子彈glPushMatrix()的作用就是現(xiàn)時(shí)打造一顆C3型子彈并把它壓入彈夾,于是彈夾最頂端的兩顆子彈是一樣的,都是C3型的子彈,隨后所作的平移變化旋轉(zhuǎn)變換等都是在最上面那顆C3子彈上所作的,并不影響下面的那顆C3子彈,直到glPopMatrix()把最上面的那顆C3子彈發(fā)射出去,讓下面的那顆C3子彈成為彈夾最頂上的那顆。

3.5?glutSwapBuffers

glutSwapBuffers函數(shù)是OpenGL中GLUT工具包中用于實(shí)現(xiàn)雙緩沖技術(shù)的一個(gè)重要函數(shù)。該函數(shù)的功能是交換兩個(gè)緩沖區(qū)指針。

3.6?glutPostRedisplay

glutPostRedisplay 標(biāo)記當(dāng)前窗口需要重新繪制。通過glutMainLoop下一次循環(huán)時(shí),窗口顯示將被回調(diào)以重新顯示窗口的正常面板。多次調(diào)用glutPostRedisplay,在下一個(gè)顯示回調(diào)只產(chǎn)生單一的重新顯示回調(diào)。

3.7?glutIdleFunc

glutIdleFunc設(shè)置全局的回調(diào)函數(shù),當(dāng)沒有窗口事件到達(dá)時(shí),GLUT程序功能可以執(zhí)行后臺處理任務(wù)或連續(xù)動(dòng)畫。如果啟用,這個(gè)idle function會(huì)被不斷調(diào)用,直到有窗口事件發(fā)生。回調(diào)函數(shù)沒有參數(shù)。

3.8?glutReshapeFunc與glutDisplayFunc

glutReshapeFunc是窗口改變的時(shí)候調(diào)用的函數(shù),在這個(gè)里面可以根據(jù)縮放后的窗口重新設(shè)置camera的內(nèi)部參數(shù),比如橫縱比啥的; glutDisplayFunc是顯示的時(shí)候調(diào)用,可見改變窗口后調(diào)用glutReshapeFunc后還是會(huì)調(diào)用glutDisplayFunc進(jìn)行顯示的。
不可以不用glutDisplayFunc,比如你想實(shí)現(xiàn)動(dòng)畫效果,也就是說窗口大小不變而里面的內(nèi)容發(fā)生變化,這時(shí)候通過設(shè)置glutIdelFunc,在里面最后調(diào)用glutPostdisplay,來通知glutdisplayFuc重畫,實(shí)現(xiàn)動(dòng)畫。
簡單的說,glutReshapeFunc與glutIdelFunc這些函數(shù)都不去直接處理顯示,而是設(shè)置好相應(yīng)的參數(shù),讓glutdisplayfunc來執(zhí)行繪制。

4.參看資料

[1]施萊爾, GrahamSellers, JohnKessenich,等. OpenGL編程指南[M]. 機(jī)械工業(yè)出版社, 2014.

總結(jié)

以上是生活随笔為你收集整理的OpenGL编程指南4:双缓冲实现运行的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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