文档介绍:1
第 13 章
网格化
网格化的理由
虽然在OpenGL中可以使用glBegin(GL_POLYGON)来画一个多边形,但是它只能实现简单的凸多边形。对于一些复杂的多边形,比如凹多边形,或者有空心的多边形,glBegin(GL_POLYGON)就不能满足需求了。通常可以采用一种叫做“网格化"的方法来画复杂的多边形。
网格化的理由
网格化步骤
要用网格化的方法画多边形,步骤如下:
1) gluNewTess(); //创建一个新的网格化对象。
2) gluTessCallback(); //注册回调函数,完成网格化期间的一些操作。
3) gluTessProperty(); //可有可无的,设置一些网格化的属性值。
4) gluTessBeginPolygon(); //开始画多边形      draw polygon...//在这里画多边形,一个一个点画就可以,最后一个点会和第一个点自动连接起来      gluTessEdnPolygon(); //结束画多边形
5) gluDeleteTess(); //删除网格化对象
GLUtesselator*gluNewTess();
该函数创建一个网格化对象,并返回一个指向该对象的指针。
删除网格化对象
void gluDeleteTess(GLUtesselator*tessobj);
网格化回调函数
void gluTessCallback(GLUtesselator*tessobj,GLenum type,void(*fn)())
网格化属性
void gluTessProperty(GLUtesselator*tessobj,GLenum property,GLdouble value)
网格化属性
如果一个区域的环绕数属于被选择的类别,环绕规则将其视为内部区域。内部需要渲染填充,外部不需。
定义多边形
限定多边形的描述
void gluTessBeginPolygon(GLUtesselator*tessobj,void*user_data)
gluTessEndPolygon(GLUtesselator*tessobj);
限定多边形轮廓线的定义
void gluTessBeglnContour(GLUtesselator*tessobj);
void gluTessEndContour(GLUtesselator*tessobj);
在多边形上指定顶点
void gluTessVertex(GLUtesselator*tessobj,GLdouble coords[3], void*vertex_data);
举例
在场景中左边绘制一个中间有孔的长方形;右边绘制两个互倒的三角形,构成六角形。用w键切换GL_FILL和GL_LINE,用空格键切换环绕模式。