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】,可以看出当有大量点共用时,三角形条带相比三角形可以节省许多存储空间。具体构成方式如下图所示:

GL_TRIANGLE_STRIP

假设起始点的坐标序列号是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

四边形条带如下图所示:

QUAD_STRIP 
这种方式绘制的规则如下: 
第一段四边形的起始边由顶点数组中前两个点决定,边的矢量方向由这两点的延伸方向决定;起始边的对边由顶点数组中其后的两个点决定,如果起始边和对边的矢量方向不同,那么四边形会扭曲(也就是说正确的四边形条带,每两个点的方向是一致的)其后的绘制起始边的方向由上一段决定。(参考上图,第一条边的上面点是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

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

TRIANGLE_FAN

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

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

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

-------------------------------------对于参照三个顶点最后的那个顶点索引 计算如下:

在某些情况下GL_TRIANGLE_STRIP的绘图方式常常使人困惑,下面将对其进行解释。
 GL_TRIANGLE_STRIP是将顶点传递给opengl渲染管道线(pipeline)进行进一步处理的方式(创建几何图形)。还有另外两种GL_TRIANGLES和GL_TRIANGLE_FAN. 关于另外两种方式,参考opengl programming guide。

观察下图,感受一下triangle strip。

这个strip 由6个点构成了四个三角形,顶点传递到渲染管道线的顺序是影响环绕顺序的关键。
创建一个三角形至少需要三个顶点,每一个新增的顶点都形成一个新的三角形。三角形将根据顶点序号的奇偶自行创建:
偶数环绕规则:

奇数环绕规则:

我们来剖析一下上面的例子感受一下:
l   V1,v2,v3形成了第一个三角形,你也可以说v3是奇数,所以由v1,v2,v3构成。
l   V4是偶数,所以下一个三角形由v3,v2,v4构成。
l   V5是奇数,所以下一个三角形由v3,v4,v5构成
l   V6是偶数,所以下一个三角形由v5,v4,v6构成


考虑到两种绘制三角形的方式,环绕方式作为保留

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值