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

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

2.6 视见空间变换

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

2.7 光栅化

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

2.8 绘制

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

你可能感兴趣的:(OpenGL)