OpenGL绘制凹多变形
来源:互联网 发布:淘宝双11交易额2016 编辑:程序博客网 时间:2024/04/30 01:04
参考:http://blog.csdn.net/jnleec/article/details/8141863
参考:http://www.songho.ca/opengl/gl_tessellation.html
http://m.blog.csdn.net/blog/sangni007/9040257
http://blog.csdn.net/wind_hzx/article/details/11830425
环境:windows8.1 ,vs2013
一、简介
OpenGL中认为合法的多边形必须是凸多边形,凹多边形、自交多边形、带孔的多边形等非凸的多边形在OpenGL中绘制会出现出乎意料的结果。例如,在大多数系统中,只有多边形的凸包被填充,而在有些系统中,并非所有的凸包都被填充。OpenGL之所以对合法多边形类型做出限制,是为了更方便地提供能够对符合条件的多边形进行快速渲染的硬件。简单多边形可被快速地渲染,而复杂多边形难以快速检测出来。为了最大限度的提高性能,OpenGL假定多边形是简单的。
二、凹多边形的绘制
虽然在OpenGL中可以使用glBegin(GL_POLYGON)来画一个多边形,但是它只能实现简单的凸多边形。对于一些复杂的多边形,比如凹多边形,或者有实心有空心的多边形,OpenGL的glBegin(GL_POLYGON)就不能满足需求了。
通常可以采用一种叫做"分格化"的方法来画复杂的多边形。非凸多边形最简单的填充方法最简单的应该是GLU 网格化对象GLUtesselator(GLUT库或者libTess库)。要用分格化的方法画多边形,步骤如下:
1. gluNewTess(); //创建一个新的分格化对象
2. gluTessCallback(); //注册回调函数,完成分格化的一些操作,照着写就行了。
3. gluTessProperty(); //设置一些分格化的属性值,如环绕数和环绕规则,用来确定多边形的内部和外部
4. gluTessBeginPolygon(); //开始画多边形
gluTessBeginContour(tessobj);//设置多边形的边线 1
gluTessEndContour(tessobj);//结束设置边线1
gluTessBeginContour(tessobj);//,如果有边线2,设置多边形的边线 2
gluTessEndContour(tessobj);//结束设置边线2
5.gluTessEdnPolygon(); //结束画多边形
6. gluDeleteTess(); //删除分格化对象
绘制代码如下:
void drawGraphics(int type){GLUtesselator * tessobj;tessobj = gluNewTess();//注册回调函数 gluTessCallback(tessobj, GLU_TESS_VERTEX, (void (CALLBACK *)())vertexCallback);gluTessCallback(tessobj, GLU_TESS_BEGIN, (void (CALLBACK *)())beginCallback);gluTessCallback(tessobj, GLU_TESS_END, (void (CALLBACK *)())endCallback);gluTessCallback(tessobj, GLU_TESS_ERROR, (void (CALLBACK *)())errorCallback);//gluTessCallback(tessobj, GLU_TESS_COMBINE, (void (CALLBACK *)())combineCallback);//多边型边自相交的情况下回调用回调函数 gluTessBeginPolygon(tessobj, NULL);gluTessBeginContour(tessobj);//设置多边形的边线 gluTessVertex(tessobj, g_vertex[k][j], g_vertex[k][j]);gluTessEndContour(tessobj);gluTessEndPolygon(tessobj);gluDeleteTess(tessobj);}
回调函数:
//顶点的回调函数 void CALLBACK vertexCallback(GLvoid* vertex){GLdouble* pt;int numb;pt = (GLdouble*)vertex;glColor3f(0.8, 0.8, 0.8);glVertex3d(pt[0],pt[1],pt[2]);}void CALLBACK beginCallback(GLenum type){glBegin(type);}void CALLBACK endCallback(){glEnd();}void CALLBACK errorCallback(GLenum errorCode){const GLubyte * estring;//打印错误类型 estring = gluErrorString(errorCode);fprintf(stderr, "Tessellation Error: %s/n", estring);exit(0);}
三、思考
当然也可以利用回调函数记录分格化的顶点和绘制类型,然后利用数组的绘制函数进行一次性的绘制,以提高绘制效率。
- OpenGL绘制凹多变形
- OpenGL Tessellation绘制凹多边形
- 判断一个多变形是顺时针还是逆时针的方法(含凹多边形)
- OpenGL GL_EDGE_FLAG、GL_POLYGON_MODE、glPolygonMode组合使用将凹多边形切割成凸多边形绘制
- OpenGL绘制心形函数
- opengl shader 绘制心形
- opengl es画凹多边形问题:切割凹多边形为三角形
- OpenGL绘制填充非凸边形
- OpenGL: OpenGL圆柱面绘制贴图
- 【Python那些事儿】为多变量数据绘制散点图
- 杭电2108判断凹凸边形
- 多变形扫描线算法
- OpenGL的数组绘制
- 用OpenGL绘制地球
- OpenGL曲线绘制:线段
- 利用OpenGL绘制按钮
- opengl 绘制简单图形
- openGL绘制图像
- 聊聊并发-Java中的Copy-On-Write容器
- 04-3. Huffman Codes (30)
- 沃通国际认证:全球30亿网民的浏览器都能展示
- I/O重定向和管道
- LeetCode—Factorial Trailing Zeroes
- OpenGL绘制凹多变形
- String StringBuffer StringBuilder
- 九度 题目1000:计算a+b
- 2d-x 拷贝机制
- Apache Commons-logging+log4j配置
- 关联、组合、聚合、依赖关系比较
- Java代码标准化
- 判断浏览器类型,区分手机和PC
- Log4j的应用实例