固定管线时代的openGL可以使用GL_POLYGON来描画简单的凸多边形。但是无法直接描画凹的,带孔的或者自交的多边形。
而非固定管线时代openGL3.*,openGL4.*,直接就没有了GL_POLYGON。
不管是那种情况,都需要将多边形转化为三角形(三角形,三角带,三角扇)。我们很容易在网络上搜索到gluNewTess这个系列的函数,用来分割多边形。但是所有的例子都是在旧版本openGL下进行的,其实在这个系列函数在新版本openGL中仍然可以使用。现在开始正文,内容比较简单。
1.gluNewTess 创建一个tess对象
2.gluTessProperty 设置下环绕方向
3.gluTessCallback 设置回调函数(GLU_TESS_BEGIN,GLU_TESS_END,GLU_TESS_VERTEX等)
4.gluTessBeginPolygon,gluTessBeginContour,gluTessVertex等函数
以上部分参考网络上的例子。这里只说一下注意的地方。
多边形会被分割为多个面片,每个面片的BeginMode类型是不一样的,有可能是GL_TRIANGLE_STRIP或者GL_TRIANGLE_FAN。比如一个18个点的多边形,可能会被分割成3个面片:6个点组成的GL_TRIANGLE_STRIP,9个点组成的GL_TRIANGLE_FAN,9个点组成的GL_TRIANGLE_STRIP。(数组是我编的,但是a.分割不会创建新点,b.因为存在不同三角形共用点的情况,分割后的点数量大于分割前的。)
基于上面的讨论,我们需要获取每面片的BeginMode和点序列。相关代码如下:
1.
GLenum