OpenGL编程指南4:双缓冲实现运行
生活随笔
收集整理的這篇文章主要介紹了
OpenGL编程指南4:双缓冲实现运行
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.前言
繪制一個旋轉的方塊,主要為了說明glutSwapBuffers()函數的用法。 同時也為了學習如何使用GLUT控制輸入設備,并打開或關閉空閑處理函數。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); //清空當前所偶有顏色glShadeModel(GL_FLAT); //設置著色模式 } void display(void) {glClear(GL_COLOR_BUFFER_BIT); //清除viewport的緩沖區glPushMatrix();//將當前矩陣保存入堆棧頂(保存當前矩陣)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();//實現雙緩沖技術,交換兩個緩沖區指針。 } void spinDisplay(void) {spin = spin + 2.0;if(spin > 360.0)spin = spin - 360.0;glutPostRedisplay(); // 標記當前窗口需要重新繪制 } void reshape(int w,int h) {glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION); //指定哪一個矩陣是當前矩陣glLoadIdentity(); //重置當前指定的矩陣為單位矩陣glOrtho(-50,50,-50,50,-1,1); //將當前的可視空間設置為正投影空間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);//全局的回調函數,響應鼠標左鍵操作,更新圖像旋轉之后結果break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(NULL); //全局回調函數,響應鼠標中鍵操作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); //窗口改變的時候調用的函數glutMouseFunc(mouse); //響應鼠標事件glutMainLoop();return 0; }輸出結果:3.函數解析
3.1?glClearColor
通過glClear使用紅,綠,藍以及AFA值來清除顏色緩沖區的,并且都被歸一化在(0,1)之間的值,其實就是清空當前的所有顏色。3.2?glShadeModel
void glShadeModel ( GLenum mode)是OpenGL1.0提供的接口。作用是設置著色模式。參數mode可以是GL_SMOOTH(默認值)或GL_FLAT。采用恒定著色時(即GL_FLAT),使用圖元中某個頂點的顏色來渲染整個圖元。在使用光滑著色時(即GL_SMOOTH),獨立的處理圖元中各個頂點的顏色。對于線段圖元,線段上各點的顏色將根據兩個頂點的顏色通過差值得到。對于多邊形圖元,多邊形內部區域的顏色將根據所有頂點的顏色差值得到。3.3?glClear
void glClear(GLbitfield mask);參數說明:
GLbitfield:可以使用 | 運算符組合不同的緩沖標志位,表明需要清除的緩沖,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除顏色緩沖以及深度緩沖,可以使用以下標志位
GL_COLOR_BUFFER_BIT: ? 當前可寫的顏色緩沖
GL_DEPTH_BUFFER_BIT: ? 深度緩沖
GL_ACCUM_BUFFER_BIT: ? 累積緩沖
GL_STENCIL_BUFFER_BIT: 模板緩沖
3.4?glPushMatrix &&?glPopMatrix
glPushMatrix(),glPopMatrix()這兩個函數是搭配使用的,中間放置幾何變換。glPushMatrix()的作用是把矩陣壓入棧中保存起來,留著以后再用,就好象把子彈壓入槍膛一樣。但這個壓子彈不是簡單滴丫,它是把和彈夾的最頂的那顆子彈一模一樣的子彈壓入彈夾。假如說彈夾的子彈從下往上裝的子彈各不相同,依次為A1型子彈,B2型子彈,C3型子彈glPushMatrix()的作用就是現時打造一顆C3型子彈并把它壓入彈夾,于是彈夾最頂端的兩顆子彈是一樣的,都是C3型的子彈,隨后所作的平移變化旋轉變換等都是在最上面那顆C3子彈上所作的,并不影響下面的那顆C3子彈,直到glPopMatrix()把最上面的那顆C3子彈發射出去,讓下面的那顆C3子彈成為彈夾最頂上的那顆。3.5?glutSwapBuffers
glutSwapBuffers函數是OpenGL中GLUT工具包中用于實現雙緩沖技術的一個重要函數。該函數的功能是交換兩個緩沖區指針。3.6?glutPostRedisplay
glutPostRedisplay 標記當前窗口需要重新繪制。通過glutMainLoop下一次循環時,窗口顯示將被回調以重新顯示窗口的正常面板。多次調用glutPostRedisplay,在下一個顯示回調只產生單一的重新顯示回調。3.7?glutIdleFunc
glutIdleFunc設置全局的回調函數,當沒有窗口事件到達時,GLUT程序功能可以執行后臺處理任務或連續動畫。如果啟用,這個idle function會被不斷調用,直到有窗口事件發生。回調函數沒有參數。3.8?glutReshapeFunc與glutDisplayFunc
glutReshapeFunc是窗口改變的時候調用的函數,在這個里面可以根據縮放后的窗口重新設置camera的內部參數,比如橫縱比啥的; glutDisplayFunc是顯示的時候調用,可見改變窗口后調用glutReshapeFunc后還是會調用glutDisplayFunc進行顯示的。不可以不用glutDisplayFunc,比如你想實現動畫效果,也就是說窗口大小不變而里面的內容發生變化,這時候通過設置glutIdelFunc,在里面最后調用glutPostdisplay,來通知glutdisplayFuc重畫,實現動畫。
簡單的說,glutReshapeFunc與glutIdelFunc這些函數都不去直接處理顯示,而是設置好相應的參數,讓glutdisplayfunc來執行繪制。
4.參看資料
[1]施萊爾, GrahamSellers, JohnKessenich,等. OpenGL編程指南[M]. 機械工業出版社, 2014.總結
以上是生活随笔為你收集整理的OpenGL编程指南4:双缓冲实现运行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenGL编程指南3:GLUT:Ope
- 下一篇: 从 VC7 的 CHtmlView 不能