OpenGL基础教程1

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*函数来设置的。

NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第39课 物… NeHe的OPENGL中文教程:第38课 从… NeHe的OPENGL中文教程:第37课 卡… 愚人节十大IT假新闻:Opera浏览器… NeHe的OPENGL中文教程:第36课 放… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第35课 AVI… NeHe的OPENGL中文教程:第34课 从… NeHe的OPENGL中文教程:第33课 加… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第32课 Alp… NeHe的OPENGL中文教程:第31课 模… NEHE的OPENGL中文教程:第30课 碰… NEHE的OPENGL中文教程:第30课 碰… NeHe的OPENGL中文教程:第29课 Bli… NeHe的OPENGL中文教程:第28课 贝… NeHe的OPENGL中文教程:第27课 影… NeHe的OPENGL中文教程:第26课剪裁… NeHe的OPENGL中文教程:第25课 变… NeHe的OPENGL中文教程:第24课 TAG… NeHe的OPENGL中文教程:第23课 球… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第22课 凸… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第21课 反… NeHe的OPENGL中文教程:第20课 蒙… NeHe的OPENGL中文教程:第19课 粒… NeHe的OPENGL中文教程:第18课 二… NeHe的OPENGL中文教程:第17课 2D… NeHe的OPENGL中文教程:第16课 雾 NeHe的OPENGL中文教程:第15课 图… NeHe的OPENGL中文教程:第14课 图… NeHe的OPENGL中文教程:第13课 位… NeHe的OPENGL中文教程:第12课 显… NeHe的OPENGL中文教程:第11课 飘… NeHe的OPENGL中文教程:第十课 漫… NeHe的OPENGL中文教程:第九课 漂… NeHe的OPENGL中文教程:第八课 Alp… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第七课 纹… NeHe的OPENGL中文教程:第六课 纹… NeHe的OPENGL中文教程:第五课 向3… NeHe的OPENGL中文教程:第四课 旋… NeHe的OPENGL中文教程:第三课 着… NeHe的OPENGL中文教程:第二课 多… NeHe的OPENGL中文教程:第一课 新… NeHe的OPENGL中文教程:第一课 新… DirectX与OpenGL方面的经典电子书… VC++ 6.0下OpengGL配置以及glut配… 怎样开始学习OpenGL
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值