OpenGL基本图元转换为GL_TRIANGLES

1. 简介

在OpenGL中基本图元是构成几何体的基本要素,OpenGL在版本发展过程中,支持的图元类型也有一些变化。

2. 图元类型

2.1 OpenGL 2.1支持的图元类型

OpenGL 2.1是OpenGL Legecy,它支持的图元类型包括一下10种:

GL_POINTS       //点
GL_LINES        //线段
GL_LINE_STRIP   //多段线
GL_LINE_LOOP    //线圈
GL_TRIANGLES    //三角形
GL_TRIANGLE_STRIP //三角形条带
GL_TRIANGLE_FAN   //三角形扇
GL_QUADS          //四边形
GL_QUAD_STRIP     //四边形条带
GL_POLYGON        //多边形(凸)

这些类型也是我们才以前OpenGL立即模式中使用的类型 (glBegin函数中指定的类型枚举值)

2.2 OpenGL 3.3支持的图元类型

在OpenGL 3.3中(core profile),对之前版本中可能引起效率低下的图元类型进行了精简,同时为了配合着色语言,添加了新的类型,包括以下几种:

GL_POINTS
GL_LINE_STRIP
GL_LINE_LOOP
GL_LINES
** GL_LINE_STRIP_ADJACENCY **
** GL_LINES_ADJACENCY **
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_TRIANGLES
** GL_TRIANGLE_STRIP_ADJACENCY **
** GL_TRIANGLES_ADJACENCY **
(**表示新增的类型)

相比之前的版本,删除了四边形和多边形的类型(由于四边形和多边形不能保证所有组成它们的点一定共面),同时新增了一些应用在Geomtry Shader中的几何类型

OpenGL 4.5支持的图元类型

在最新版本的OpenGL 4.5中支持的图元类型与3.3基本一致,添加了一项而已,如下:

GL_POINTS
GL_LINE_STRIP
GL_LINE_LOOP
GL_LINES
GL_LINE_STRIP_ADJACENCY
GL_LINES_ADJACENCY 
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_TRIANGLES
GL_TRIANGLE_STRIP_ADJACENCY
GL_TRIANGLES_ADJACENCY
*** GL_PATCHES ***
(***表示新增的类型)

3. 图元的三角化

在模型算法的分析中,模型有时候会要求需要设置成GL_TRIANGLES类型的,三角形类型相对简单直观,下面对于如何将基本几何类型转换为三角形做一些说明。

关于转换到三角形,在OpenSceneGraph中已经提供了一个类来处理,这个类是 osg::TriangleFunctor

3.1 不能转换的类型

以下类型不能转换为GL_TRIANLGES(或者转换后没有意义)
1. GL_POINTS
2. GL_LINES
3. GL_LINE_STRIP
4. GL_LINE_LOOP

3.2 GL_TRIANGLE_STRIP

首先要了解GL_TRIANGLE_STRIP的构成方式,它是由最少3个点构成(正好3个点就是一个GL_TRIANGLE),每增加1个点,新增的点会和之前已有的两个点构成新的三角形,依次类推。也就是说当三角形条带(GL_TRIANGLE_STRIP)由n个点组成时,构成的三角形个数是 n -2 个【相同情况下TRIANGLES的三角形个数是 n / 3】,可以看出当有大量点共用时,三角形条带相比三角形可以节省许多存储空间。具体构成方式如下图所示:

OpenGL基本图元转换为GL_TRIANGLES_第1张图片

假设起始点的坐标序列号是0,新增的点依次往后增加,那么转换的算法如下:
1. 当所有点数量小于或者等于2时,无法构成三角条带
2. 点号从0开始,(点号n)是偶数时,构成的三角形是 [ n, n+1, n+2]
3. 点号从0开始,(点号n)是奇数时,构成的三角形是 [n, n+2, n+1]

3.3 GL_QUADS

四边形转换为三角形,每一个四边形转换为两个三角形,假设组成四边形的四个点号是 [n, n+1, n+2, n+3],转换之后的两个三角形是:
1. [n, n+1, n+2]
2. [n, n+2, n+3]

3.4 GL_QUAD_STRIP

四边形条带如下图所示:

OpenGL基本图元转换为GL_TRIANGLES_第2张图片
这种方式绘制的规则如下:
第一段四边形的起始边由顶点数组中前两个点决定,边的矢量方向由这两点的延伸方向决定;起始边的对边由顶点数组中其后的两个点决定,如果起始边和对边的矢量方向不同,那么四边形会扭曲(也就是说正确的四边形条带,每两个点的方向是一致的)其后的绘制起始边的方向由上一段决定。(参考上图,第一条边的上面点是v0,下面点是v1,那么v2和v3的顺序也是v2在上,v3在下)。转换到三角形的算法是:

假设当前点号是n,那么三角形是
[n, n+1, n+2]
[n+1, n+3, n+2]
之后每次递增两个点,接着继续生成两个三角形

3.5 GL_TRIANGLE_FAN和GL_POLYGON

三角形扇的转换方式是共用一个顶点,如下图所示:

OpenGL基本图元转换为GL_TRIANGLES_第3张图片

当转换为三角形时,第一个顶点是共用的,于是转换的三角形需要依次是[v0, v1, v2] [v0,v2,v3] [v0, v3, v4]

多边形在转换的过程中方式很多,三角形扇的这种转换方式也适用于多边形转换,转换的算法如下:

点号从2开始,每增加1,生成一个新的三角形直到最后一个顶点。假设当前的点号是n,则组成的三角形是 [v0, vn, vn+1]

你可能感兴趣的:(opengl,Primitives,OpenGL和OSG基础)