« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
☆★☆★☆★☆★☆★☆ 生活的点点记录,以及一些体会...........
喜欢是淡淡的爱,爱是深深的喜欢.
时间会见证一切.......................
欢迎大家指出错误,共同进步..........
期待中..............................
☆★☆★☆★☆★☆★☆ |
Blog信息 |
blog名称: 日志总数:162 评论数量:312 留言数量:0 访问次数:941425 建立时间:2005年5月17日 |

| |
[opengl study process]GLUT教程(四) 文章收藏
oceanblue 发表于 2008/9/24 21:53:12 |
转载http://blog.csdn.net/xie_zi
GLUT教程
动画
到现在为止,我们有了一个画着一个白色三角形的OpenGL窗口,但一点也不激动人心。现在让我们在这节教程里,让这个三角形自己旋转起来。
让我们回到main()函数,增加些额外的设置。首先告诉GLUT我们想要一个双缓冲区。双缓冲区通过在后一个缓冲区里绘画,并不停交换前后缓冲区(可见缓冲区),来产生平滑的动画。使用双缓冲区可以预防闪烁。
………….
glutInitDisplayMode(GL_DEPTH|GLUT_DOUBLE|GLUT_RGBA);
…………
接着我们要做的是告诉GLUT,当应用程序空闲的时候渲染函数应该被调用。这导致GLUT一直调用渲染函数而产生动画。GLUT提供了一个函数:glutIdleFunc.这个函数使另一个函数在程序空闲的时候就会被调用。
void glutIdleFunc(void(*func)(void));
参数:
func:在程序空闲的时候就会被调用的函数的函数名。
按照我们的想法,当程序空闲时应该调用的函数是我们先前定义的渲染函数: renderScene。由于OpenGL默认没有开启深度测试,我们还要开启它,这样我们才能知道哪个物体在前面,哪个物体在后面。深度测试的开启在main()函数里,下面看看现在的main函数。void main(int argc, char **argv) { glutInit(&argc, argv); // 在这里设置双缓冲区。 glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("3D Tech- GLUT Tutorial"); glutDisplayFunc(renderScene); // 这里让程序空闲时调用renderScene, glutIdleFunc(renderScene); glutReshapeFunc(changeSize); //开启深度测试。 glEnable(GL_DEPTH_TEST); glutMainLoop();}
下面就是设置渲染函数renderScene。我们定义了一个浮点型变量并初始化为0.0,下面在renderScene函数加一些必须的东西。
float angle=0.0; void renderScene(void) { //注意我们这里清除了深度缓冲区。 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //保存当前模型视图矩阵。 glPushMatrix(); glRotatef(angle,0.0,1.0,0.0); glBegin(GL_TRIANGLES); glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); // 弹出堆栈 glPopMatrix(); // 交换缓冲区 glutSwapBuffers(); // 让angle自动增加。 angle++;}
glutSwapBuffers函数交换了前后缓冲区,函数原型如下:
void glutSwapBuffers();
好了,我们得到了一个旋转的三角形,你可以下载这个VC工程在这里(glut2.zip)。很棒吧?。但再次说下,我们不会渲染一些十分精美的画面,这是为了保持代码的简洁。也因为主要是学习GLUT。 |
|
|