OpenGL基础教程1
来源:互联网 发布:大数据与信息安全专业 编辑:程序博客网 时间:2024/04/29 22:19
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*函数来设置的。
- Android OpenGL基础教程 1
- opengl es 基础教程1
- OpenGL基础教程1
- OpenGL基础教程(1):体系结构一览
- Android OpenGL基础教程 2
- Qt openGL基础教程
- OpenGL ES基础教程
- OpenGL 入门基础教程 —— 基本术语篇【1】
- [Android实例] OpenGL ES基础教程(一)
- [Android实例] OpenGL ES基础教程(二)
- OpenGL基础教程(2):着色器
- OpenGL 入门基础教程 —— 彩色立方体
- OpenGL 入门基础教程 —— 添加纹理
- OpenGL 入门基础教程 —— 基本术语篇【2】
- OpenGL 入门基础教程 —— 基本术语篇【3】
- OpenGL 入门基础教程 —— 打开第一个窗口
- OpenGL 入门基础教程 —— VAO 和 VBO辨析
- OpenGL 入门基础教程 —— 矩阵的变换
- JZOJ4709 matrix 组合数
- intellij idea关闭重复代码提醒
- zzuli1918 (二分图 坑)
- 关于手机端微信二维码无法识别的问题
- 最为简单实用的apk反编译工具
- OpenGL基础教程1
- 程序员懂得写代码,远远不够……
- java多线程,并发面试题
- 测试junit类的通用写法
- 数组去实现链表
- 浅谈android开发
- 【暑期训练三】晴天系列—H题
- IO流——数据类型处理流(DataInputStream和DataOutputStream)
- Android 实时加载网络新闻