OpenGL基础教程1
2016-08-17 19:41
183 查看
1、概述
openGL有以下优点
(1)与C语言紧密结合
(2)强大的可移植性
(3)改性能的图形渲染
在OpenGL中,使用齐次坐标来表示空间中的点和方向。用(x,y,z,1)来表示空间中的点,用(x,y,z,0)来表示空间中的方向。这让我们可以使用一个公式对点和方向进行运算。
2、基本绘图
可以用OpenGL来描述点,然后用点来描述集合图形
典型的使用模式如下
openGL支持两种模式,一种是RGBA模式,而另一种是颜色索引模式。无论是哪种模式,计算机都需要为每一个像素保留一些数据。所不同的是,RGBA模式中,数据就代表颜色,而后者数据只是一个索引。使用前者指定颜色的方法是
同样,我们也可以为统一多边形的不同顶点指定颜色,也可以规定是使用单色模式还是平滑模式。
解释一下,glClear(GL_COLOR_BUFFER_BIT)意思是把屏幕中的颜色情况。但是显然,屏幕的种类不同“”空“”的定义也就不同。你当然也可以手工指定屏幕锁清空的颜色,如glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
3、模型变换,视图变换,投影变换,视口变换
模型变换:通过旋转,缩放,平移等方式将用户模型防止在世界坐标系的适当位置。模型变换的底层由4*4矩阵实现。矩阵里没有交换律,所以执行不同的变换的顺序不同会造成结果不同。由于矩阵运算的相关知识,如果从世界坐标系来看,实际执行的和代码书写的顺序相反。而如果从物体自己的坐标系来看,实际执行的顺序和代码书写的顺序相同。模型变换可以对对象进行评议,缩放和旋转,镜像。
常见的变换代码有glTranslatef,glRotatef等。
视图变换:OpenGL
OpenGL采用的是虚拟照相机的模型。视图变换完后会进入照相机坐标系。
其中eye指定相机位置,center指定相机指向目标位置,up指定viewUp向量。viewup也是一个三维向量,提供了一种不改变相机朝向和位置改变成像的方法(想象为改变胶片的摆放方式)。一般取(0,1,0),如果取为(0,-1,0)相片就会倒过来。
投影变换:OpenGL的最终渲染设备是2D的,所以,我们需要将3D表示的场景转为最终的2D形式。
视口变换:将规范化设备坐标转化为屏幕坐标的过程
4、动画
双缓冲技术
计算机上的动画显然不能像现实世界中那样慢慢画,不然画一半的时候被观众看到了,眼睛的反应速度有限,就算你事后补全观众也未必能反应过来。所以在现存上开辟两块区域,一块作为绘画区域,一块作为显示区域,只要需要的时候交换两块显存的指针就好了。
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE)将设置为单缓冲,改为GLUT_DOUBLE就是双缓冲了。
如果我们要实现一个动画,常规代码如下:
大家知道显示器的刷新频率是有限的,一般来说一秒钟60次到120次。有时候计算机可以画的很快,但是显示器的刷新却跟不上了,这样不但会造成毫无意义的性能浪费,还会造成一些后果:比如说显示器正在刷新过程中所需要绘制内容却变化了。所以,计算机绘图的速度不要超过显示器刷新的频率。采用垂直同步技术可以解决这一问题。只有在显示器刷新时,才将绘制好的图像传出来提供显示。但是,如果CPU全速运转也无法跟上刷新速度的话,反而会导致帧率更低。
5、光照和材质
不同的是,光源是通过glLight*函数来设置的,而材质则是通过glMaterial*函数来设置的。
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*函数来设置的。
相关文章推荐
- Qt openGL基础教程
- OpenGL 入门基础教程 —— 模型的变换
- OpenGL基础教程(1):体系结构一览
- OpenGL 入门基础教程 —— 彩色立方体
- OpenGL 入门基础教程 —— VAO 和 VBO辨析
- ArchieOpenGL基础教程第五课:搭建OpenGL基本框架③添加三维图元显示
- OpenGL 4.0 GLSL 基础教程概览——VAO和VBO常用操作接口
- OpenGL 入门基础教程 —— 基本术语篇【3】
- [原]OpenGL基础教程(一)多边形绘制
- ArchieOpenGL基础教程第九课:光照和键盘
- OpenGL 入门基础教程 —— 基本术语篇【1】
- OpenGL 入门基础教程 —— 加载obj模型
- [原]OpenGL基础教程(二)多边形绘制
- [原]OpenGL基础教程(五)缓冲区数据更新方式
- OpenGL 入门基础教程 —— 基本术语篇【2】
- ArchieOpenGL基础教程第二课:搭建OpenGL框架② 添加全屏控制
- [Android实例] OpenGL ES基础教程(二)
- ArchieOpenGL基础教程第三课:glViewport()函数和glOrtho()函数的理解——学习OpenGL三维建模前必读
- ArchieOpenGL基础教程第八课:创建3D图形和纹理映射(MFC/SDI)
- [Android实例] OpenGL ES基础教程(二)