OpenGL分格化和二次方程表面

来源:互联网 发布:加密狗写入软件 编辑:程序博客网 时间:2024/05/17 23:44

原文点击打开链接
分格化
opengl只能对凸多边形进行渲染,所以对于凹多边形和有空洞的多边形需要进行分格化处理
步骤:
1.gluNewTess()创建一个分格化对象
2. 调用几次gluTessCallback()注册几个用于在分格化时执行必要操作的回调函数, 
3. gluTessProgerty()指定分格化属性
4. 指定一个或多个多边形轮廓线来创建和渲染经过分格化的多边形
5.复用分格化对象或gluDeleteTess删除分格化对象

分格化属性
gluTessProperty(GLUtesselator* tessobj, GLenum property, GLdouble value);
property        value     default value    function
GLU_TESS_BOUNDARY_ONLY   GL_TRUE分格化为线框多边形   GL_FALSE绘制填充多边形   
GLU_TESS_TOLERANCE     表示距离    0    多边形两点距离小于公差值value时合并
GLU_TESS_WINDING_RULE         GLU_TESS_WINDING_ODD 决定那部分位于内部和外部
gluGetTessProperty()获取属性值
gluTessNormal()控制分格化的多边形环绕方向。
定义多边形
void gluTessBeginPolygon(GLUtesselator* tessobj, void * user_data);
void gluTessEndPolygon(GLUtesselator* tessobj);
在两个函数之间进行多边形绘制,系统自动进行分格化,并按照指定的gluTessCallback和gluTessProperty进行处理。user_data会直接传递给带有DATA的回调函数。
gluTessBeginContour(GLUtesselator* tessobj);
gluTessEndContour(GLUtesselator* tessobj);
开始和结束一条闭合的轮廓线
gluTessVertex(GLUtesselator* tessobj, GLdouble coords[3], void* vertex_data);
指定多边形顶点。coords包含了三维顶点,vertex_data包含了顶点坐标,表面法向,纹理坐标, 颜色信息等所有回调函数可能用到的数据。
删除分格化对象;
void gluDeleteTess(GLUtesselator* tessobj);
提高分格化性能建议:
1. 把分格化操作的输出存储在显示列表或其他用户结构中
2. 使用gluTessNormal()提供多边形法向
3. 一个线程的情况下,使用一个分格化对象渲染大量多边形。
二次方程表面
使用分格化实现二次方程表面绘制
步骤:
1. gluNewQuadrix()创建二次方程对象
2. 指定绘图属性
 a. gluQuadrixOrientation()控制环绕方向,区分内外部分
 b. gluQuadricDrawStyle选择把物体渲染为点,线或填充多边形
 c. 对于使用光照的表面,gluQuadricNormals为每个顶点指定法线
 d. 对于进行纹理贴图的表面,gluQuadricTexture生成纹理坐标
3. gluQuadricCallback注册错误回调函数
4. 根据需要调用二次方程表面渲染函数gluSphere(), gluCylinder(), gluDisk(), gluPartialDisk().
5. gluDeleteQuadric()销毁对象,可以复用该对象。
原创粉丝点击