Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5415199
  • 博文数量: 763
  • 博客积分: 12108
  • 博客等级: 上将
  • 技术积分: 15717
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-28 21:21
个人简介

业精于勤,荒于嬉

文章分类

全部博文(763)

文章存档

2018年(6)

2017年(15)

2016年(2)

2015年(31)

2014年(14)

2013年(87)

2012年(75)

2011年(94)

2010年(190)

2009年(38)

2008年(183)

2007年(28)

分类: C/C++

2010-05-25 19:01:49

到现在为止,我们有了一个画着一个白色三角形的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。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xie_zi/archive/2007/12/02/1911793.aspx

阅读(2006) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~