1、概述
openGL有以下优点
(1)与C语言紧密结合
(2)强大的可移植性
(3)改性能的图形渲染
在OpenGL中,使用齐次坐标来表示空间中的点和方向。用(x,y,z,1)来表示空间中的点,用(x,y,z,0)来表示空间中的方向。这让我们可以使用一个公式对点和方向进行运算。
2、基本绘图
可以用OpenGL来描述点,然后用点来描述集合图形
典型的使用模式如下
glClear(GL_COLOR_BUFFER_BIT);
glBegin( /* 在这里填上你所希望的模式 */ );
/* 在这里使用glVertex*系列函数 */
/* 指定你所希望的顶点位置 */
glEnd();
glFlush();
openGL支持两种模式,一种是RGBA模式,而另一种是颜色索引模式。无论是哪种模式,计算机都需要为每一个像素保留一些数据。所不同的是,RGBA模式中,数据就代表颜色,而后者数据只是一个索引。使用前者指定颜色的方法是
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 1.0f);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
同样,我们也可以为统一多边形的不同顶点指定颜色,也可以规定是使用单色模式还是平滑模式。
解释一下,glClear(GL_COLOR_BUFFER_BIT)意思是把屏幕中的颜色情况。但是显然,屏幕的种类不同“”空“”的定义也就不同。你当然也可以手工指定屏幕锁清空的颜色,如glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
3、模型变换,视图变换,投影变换,视口变换
模型变换:通过旋转,缩放,平移等方式将用户模型防止在世界坐标系的适当位置。模型变换的底层由4*4矩阵实现。矩阵里没有交换律,所以执行不同的变换的顺序不同会造成结果不同。由于矩阵运算的相关知识,如果从世界坐标系来看,实际执行的和代码书写的顺序相反。而如果从物体自己的坐标系来看,实际执行的顺序和代码书写的顺序相同。模型变换可以对对象进行评议,缩放和旋转,镜像。
常见的变换代码有glTranslatef,glRotatef等。
视图变换:OpenGL
OpenGL采用的是虚拟照相机的模型。视图变换完后会进入照相机坐标系。
API lookAt ( GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ)
其中eye指定相机位置,center指定相机指向目标位置,up指定viewUp向量。viewup也是一个三维向量,提供了一种不改变相机朝向和位置改变成像的方法(想象为改变胶片的摆放方式)。一般取(0,1,0),如果取为(0,-1,0)相片就会倒过来。
投影变换:OpenGL的最终渲染设备是2D的,所以,我们需要将3D表示的场景转为最终的2D形式。
视口变换:将规范化设备坐标转化为屏幕坐标的过程
glViewport(GLint sx , GLint sy , GLsizei ws , GLsizei hs);
glDepthRangef(GLclampf ns , GLclampf fs );
4、动画
双缓冲技术
计算机上的动画显然不能像现实世界中那样慢慢画,不然画一半的时候被观众看到了,眼睛的反应速度有限,就算你事后补全观众也未必能反应过来。所以在现存上开辟两块区域,一块作为绘画区域,一块作为显示区域,只要需要的时候交换两块显存的指针就好了。
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE)将设置为单缓冲,改为GLUT_DOUBLE就是双缓冲了。
如果我们要实现一个动画,常规代码如下:
for(i=0; i<n; ++i)
{
DrawScene(i);
glutSwapBuffers();
Wait();
}
大家知道显示器的刷新频率是有限的,一般来说一秒钟60次到120次。有时候计算机可以画的很快,但是显示器的刷新却跟不上了,这样不但会造成毫无意义的性能浪费,还会造成一些后果:比如说显示器正在刷新过程中所需要绘制内容却变化了。所以,计算机绘图的速度不要超过显示器刷新的频率。采用垂直同步技术可以解决这一问题。只有在显示器刷新时,才将绘制好的图像传出来提供显示。但是,如果CPU全速运转也无法跟上刷新速度的话,反而会导致帧率更低。
5、光照和材质
不同的是,光源是通过glLight*函数来设置的,而材质则是通过glMaterial*函数来设置的。