概述
几乎每个OpenGL程序都会涉及到这些东西,以最近做的图形学实验2为例,总结一下:
int main(int argc,char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DOUBLE);
glutInitWindowSize(640,480);
glutCreateWindow("图形学实验2");
glutDisplayFunc(redraw);
glutReshapeFunc(reshape);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
1)glutInit是例行公事一样的存在,表示初始化。
2)glutInitDisplayMode设置显示模式,其中的GLUT_DOUBLE表示双缓冲。双缓冲指的是在绘制图形的时候先在一个缓冲区把它绘制好,绘图指令完成后再通过交换指令把它呈现到屏幕上,这样绘制效率较高。OpenGL一般采用双缓冲,如果只是显示静态图片,也可以用单缓冲模式。但我们设置了双缓冲模式以后,在绘图的函数里一定会加上这个函数:
glutSwapBuffers();//执行双缓冲交换
它的作用就是交换两个缓冲区的指针,可以简单理解成把后台画好的东西呈现到屏幕上,如果设置了双缓冲却没有交换缓冲区,往往什么都看不到。
3)调整窗口大小
4)创建窗口
5)glutDisplayFunc调用绘图函数
6)glutReshapeFunc是用来调整图形比例的,保证当窗口大小变化时图形不走样。这里可以具体看看上面例子的reshape怎么实现:
void reshape(int width,int height){
if (height==0){
height=1;//设置为1,防止除0
}
glViewport(0,0,width,height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
里面又有了很多东西,一个一个来看:
①glViewport用来设置“视口”。视口可以简单理解成窗口的一部分,默认情况下它们是重叠的。四个参数依次表示视口坐标的原点(x、y方向)以及长宽。利用这个函数我们可以分割当前的窗口,把图像分区域绘制出来。
②glMatrixMode设置了矩阵的模式。你可能会对此感到奇怪,怎么突然冒出了“矩阵”这个数学概念?其实是因OpenGL中的变换(平移、旋转等都是通过矩阵来完成的,数学上的矩阵本身就可以表示一个变换嘛)上面的代码设置成了“投影”。这里有三个参数:GL_PROJECTION表示对投影进行操作,GL_MODELVIEW表示对模型视景进行操作,GL_TEXTURE表示对纹理进行操作。
③加载单位矩阵。后面的变换矩阵都是和它做乘法。
④gluPerspective:这个函数很有意思,都可以单独开一个贴了。简单来说可以用下面这张图概括:
(图被csdn吃了)
第一个参数表示视角大小,可以简单当成我们眼睛张开多大。第二个表示宽高比。第三第四个是上图中近平面和远平面的距离。
7)glutIdleFunc
这个函数用来负责在没有窗口事件的时候OpenGL在干什么。例如:
/*没有窗口事件发生时调用*/
void idle(){
glutPostRedisplay();//加入glutPostRedisplay()来重绘图像,否则图像只有响应鼠标或键盘消息时才会更新图像
}
然后在glutIdleFunc调用它,达到的目的就是尽可能频繁地去更新窗口、绘图。这样就能看到动画效果了。如果不用它,将会看到静止的画面。
8)glutMainloop()也是例行公事一样的东西。因为OpenGL是逐帧绘制,要画出完整图像相当于进到了一个循环里,不断地画.....
最后
以上就是活泼眼神为你收集整理的【OpenGL】常见的函数说明的全部内容,希望文章能够帮你解决【OpenGL】常见的函数说明所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复