opengl笔记

2019-01-26 21:33

转:OpenGL基本概念入门1——OpenGL 工作机制

2009-05-02 22:40

1 OpenGL中3D物体的表示

在3D空间中,场景是物体或模型的集合。在3D图形渲染中,所有的物体都是由三角形构成的这是因为一个三角形可以表示一个平面,而3D物体就是由一个或多个平面构成的。比如下图表示一个非常复杂的3D地形,它门也不过是由许许多多三角形表示的。

渲染后的地形面貌 复杂的地形也是由三角形构成的 (图片来自 本站 Terrian Editor)

因此,在OpenGL中,我们只要指定一个或多个三角形,就可以表示任意3D物体。那么如何指定角形呢?OpenGL提供三种指定三角形的方法:即单个三角形、三角条形和三角扇形。

指定单个三角形。这是最简单,最直接的方法。即调用特定的OpenGL函数,传入三个顶点坐标指定一个三角形。如下图: 传入三个顶点(V1,V2,V3),指定一个三角形 三角条形。这种方式适合于同时绘制多个三角形,且这些三角形之间至少存在一条公共边。一三角条形是在单个三角形的基础上,再指定一个或多个顶点。这些顶点按照次序同上一顶点一起构一个新的三角形。下图演示了这种推进过程。

指定三个顶点,确定第一个三角形 指定第四个顶点,和上一三角形共享一边 指定第5个顶点,继续推进 三角扇形。三角扇形中,所有顶点按照一个中心点成扇形排列。如下图,是一个以V1为中心点三角扇形。

既然使用三角形就可以表示任何图形,为什么还要使用三角条形和三角扇形呢?这是因为在OpenGL渲染流水线中,对于每个顶点都要进行变换运算。而对于一些连接在一起的三角形组来说,用三角条形或三角扇形就减少了顶点的数目,这意味着减少了对顶点的运算,因此提高了渲染速度例如,上图中第三个三角扇形,该扇形描述了4个三角形。如果把这四个三角形都一一作为单个三形传给OpenGL的话,我们需要3*4=12个顶点,而使用了三角扇形之后,我们只使用了6个顶点。节约了一半的运算量!

2 OpenGL 的渲染流水线

当我们把要绘制的三角形传给OpenGL之后,OpenGL还要做许多工作以完成3D空间到屏幕的投影这一系列的过程被称为OpenGL的渲染流水线。一般地,OpenGL的渲染流程如下:

2.1 视图变换

当一个场景确定之后,如果我们想移动某个物体,或者要实现场景内的漫游,就必须进行模型视图的变换。模型视图变换可以根据需要,移动或旋转一个或多个物体。例如,如果我们想在3D空间沿着Z轴向前走的话,只需要把所有物体向-Z方向移动n个单位即可。如果我们要向左看,就应该所有物体沿着Y轴渲染向右旋转N个角度。下图演示了这个过程。

2.2 背面隐藏

在一些封闭的3D物体中,朝着物体内部的面总是不可见的。对于这些永远不可见的平面,我可以使用背面隐藏忽略对它的绘制以提高渲染速度。为了实现背面隐藏,我们在绘制三角形的时候须注意三角形的绕法。一般的,OpenGL默认为逆时针缠绕的面是正面。如下图所示的三角形中,如把顶点按照V1->V3->V2的顺序传给OpenGL,那么OpenGL就会认为这个三角形朝着屏幕的面是正面

使用背面隐藏,就要求我们在把图形传给OpenGL的时候要始终遵守正面使用逆时针绕法的规定要开启背面隐藏的功能,只需调用函数: glEnable(GL_CULL_FACE);

当然,我们也可以改变OpenGL的设置,决定是对物体的正面还是背面进行隐藏。调用如下函数

glCullFace(GL_FRONT); 来隐藏正面,也可调用 glCullFace(GL_BACK); 来隐藏背面。 2.3 光照渲染

如果你开启了光照渲染,并且为每个顶点指定了它的法线,在此过程中,OpenGL将根据顶点的线和光源的位置及性质重新计算顶点的颜色。使用光照效果可以大大提高画面的真实性。我们将在六章中讲到光照。 2.4 剪裁

剪裁就是把那些不在视见空间,或者一半在可视空间中的物体剔除或剪裁,以保证不该出现在幕上的图形就不出现。 2.5 投影

要把一个3D空间中的物体显示在屏幕上,就要进行投影。投影又有两种方式:平行投影和透视影。在平行投影中,远处的物体和近处的物体是一样大的,这种投影主要运用在计算机辅助设计(CA上,由于这种投影没有立体感,所以一般情况下使用透视投影。在透视投影中,远处的物体会变得小,因此在透视投影中,可视空间是一个平头截体(或台体)。下图表明了投影变换的原理。

2.6 视见空间变换

当3D空间中的图形经过投影成为2D图形之后,我们还要把图形缩放到窗口或屏幕上。这个过被称为视见空间变换。对于一般的游戏来说,视见空间应该是整个屏幕或窗体。但是视见空间也可是它的子集。 2.7 光栅化

当2D图形的所有变换都完成之后,就要把它们栅格化以显示在屏幕上,或保存为BMP图片。栅格其实是把变换得到的2D矢量图转化为位图的过程。

在opebgl流水线里头,有一个步骤是栅格化(Rasterization),它在顶点组合的几何信息处理后行,目的是“插值”,vertex shader的varying变量就是在这里被栅格化(/插值),然后再传入fragment shader作象素级别的处理。 2.8 绘制

在这一步中,将由Windows GDI把光栅化的图形显示在屏幕上。

转:OpenGL基本概念入门2——使用OpenGL绘图 2009-05-02 22:55

1 绘制之前的必要工作

1.1 设置窗体的视见区域 (View Port)

glViewPort(x:GLInt;y:GLInt;Width:GLSizei;Height:GLSizei);

其中,参数X,Y指定了视见区域的左下角在窗口中的位置,一般情况下为(0,0),Width和Height指定了视见区域的宽度和高度。注意OpenGL使用的窗口坐标和WindowsGDI使用的窗口坐标是不一样的。

WindowsGDI下的窗体坐标 OpenGL所定义的窗体坐标

1.2 创建投影变换

接下来,我们要设置一种投影变换。投影变换分为平行投影和透视投影。平行投影中,物体无论远近,大小都是一样的,而透视投影则相反。因此,透视投影更像是我们眼睛所看到的景物。但在某些特殊的时候,平行投影还是有它的作用的,比如3D建模程序。 1.2.1 创建平行投影

glOrtho(left, right, bottom, top, zNear, zFar: GLdouble); 可以将当前的可视空间设置为正投影空间。

其中,left指定了该平行投影最左边的平面; right指定了该平行投影最右边的平面; bottom指定了该平行投影最下边的平面; top指定了该平行投影最上边的平面;

zNear,zFar指定了近修剪平面和远修剪平面。 我们使用下面的代码创建一个平行投影:

glMatrixMode(GL_PROJECTION );//将矩阵变换对象切换为模型视图变换。

glOrtho(-ClientWidth div 2,ClientWidth div 2,-ClientHeight div


opengl笔记.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:[精选资料]关于如何培养学生勤俭节约习惯的研究

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: