注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一江春水向西流

程序人生

 
 
 

日志

 
 
关于我

夫君子之行,静以修身,俭以养德.非澹泊无以明志, 非宁静无以致远.夫学须静也,才须学也,非学无以广才,非志无以成学,淫漫则不能励精,险躁则不能治性,年与时驰,意与日去,遂成枯落,多不接世,悲守穷庐,将复何及!

网易考拉推荐

基于VC++的OpenGL编程讲座之基本图元-2  

2009-05-09 15:42:14|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  三、多边形(Polygon)

  (一)凸、凹多边形。

  OpenGL定义的多边形是由一系列线段依次连结而成的封闭区域,多边形可以是平面多边形,即所有顶点在一个平面上,也可以是空间多边形。OpenGL规定多边形中的线段不能交叉,区域内不能有空洞,也即多边形必须是凸多边形(指多边形任意非相邻的两点的连线位于多边形的内部),不能是凹多边形,否则不能被OpenGL函数接受。凸多边形和凹多边形见图三。

基于VC++的OpenGL编程讲座之基本图元-2 - cucme - 一江春水向西流
图三、凸凹多边形

  (二)边界标志问题。

  实际应用中,往往需要绘制一些凹多边形,通常解决的办法是对它们进行分割,用多个三角形来替代。显然,绘制这些三角形时,有些边不应该进行绘制,否则,多边形内部就会出现多余的线框。OpenGL提供的解决办法是通过设置边标志命令glEdgeFlag()来控制某些边产生绘制,而另外一些边不产生绘制,这也称为边界标志线或非边界线。这个命令的定义如下;

void glEdgeFlag(GLboolean flag);
void glEdgeFlag(PGLboolean pflag);

  (三)多边形绘制模式。

  多边形的绘制模式包含有:全填充式、轮廓点式、轮廓线式、图案填充式及指定正反面等。下面分别介绍相应的OpenGL函数形式。

  1)多边形模式设置。其函数为:

void glPolygonMode(GLenum face,GLenum mode);

  参数face为GL_FRONT、GL_BACK或GL_FRONT_AND_BACK;参数mode为GL_POINT、GL_LINE或GL_FILL,分别表示绘制轮廓点式多边形、轮廓线式多边形或全填充式多边形。在OpenGL中,多边形分为正面和反面,对这两个面都可以进行操作,在缺省状况下,OpenGL对多边形正反面是以相同的方式绘制的,要改变绘制状态,必须调用PolygonMode()函数,

  2)设置图案填充式多边形。其函数为:

void glPolygonStipple(const GLubyte *mask);

  参数mask是一个指向32x32位图的指针。与虚点线绘制的道理一样,某位为1时绘制,为0时什么也不绘。注意,在调用这个函数前,必须先启动glEnable(GL_POLYGON_STIPPLE);不用时用glDisable(GL_POLYGON_STIPPLE)关闭。下面举出一个多边形扩展绘制实例:

void CALLBACK display(void)
{
  /* 填充模式定义 (32x32) */
  GLubyte pattern[]= {
    0x00, 0x01, 0x80, 0x00,
    0x00, 0x03, 0xc0, 0x00,
      0x00, 0x07, 0xe0, 0x00,
      0x00, 0x0f, 0xf0, 0x00,
      0x00, 0x1f, 0xf8, 0x00,
      0x00, 0x3f, 0xfc, 0x00,
      0x00, 0x7f, 0xfe, 0x00,
      0x00, 0xff, 0xff, 0x00,
      0x01, 0xff, 0xff, 0x80,
      0x03, 0xff, 0xff, 0xc0,
      0x07, 0xff, 0xff, 0xe0,
      0x0f, 0xff, 0xff, 0xf0,
      0x1f, 0xff, 0xff, 0xf8,
      0x3f, 0xff, 0xff, 0xfc,
      0x7f, 0xff, 0xff, 0xfe,
      0xff, 0xff, 0xff, 0xff,
      0xff, 0xff, 0xff, 0xff,
      0x7f, 0xff, 0xff, 0xfe,
      0x3f, 0xff, 0xff, 0xfc,
      0x1f, 0xff, 0xff, 0xf8,
      0x0f, 0xff, 0xff, 0xf0,
      0x07, 0xff, 0xff, 0xe0,
      0x03, 0xff, 0xff, 0xc0,
      0x01, 0xff, 0xff, 0x80,
      0x00, 0xff, 0xff, 0x00,
      0x00, 0x7f, 0xfe, 0x00,
      0x00, 0x3f, 0xfc, 0x00,
      0x00, 0x1f, 0xf8, 0x00,
      0x00, 0x0f, 0xf0, 0x00,
      0x00, 0x07, 0xe0, 0x00,
      0x00, 0x03, 0xc0, 0x00,
      0x00, 0x01, 0x80, 0x00
    };
    glClear (GL_COLOR_BUFFER_BIT);
   /* 绘制一个指定图案填充的三角形 */
    glColor3f(0.9,0.86,0.4);
    glPolygonStipple (pattern);
    glBegin(GL_TRIANGLES);
      glVertex2i(310,310);
      glVertex2i(220,80);
      glVertex2i(405,80);
    glEnd();
    glDisable (GL_POLYGON_STIPPLE);
    glFlush ();
  }

  (三)指定多边形的正反面。

  其函数为:

void glFrontFace(GLenum mode);

  在正常情况下,OpenGL中的多边形的正面和反面是由绘制的多边形的顶点顺序决定的,逆时针绘制的面是多边形的正面,但是,在OpenGL中使用该函数可以自定义多边形的正面。该函数的参数mode指定了正面的方向。它可以是CL_CCW和CL_CW,分别指定逆时针和顺时针方向为多边形的正方向。
  评论这张
 
阅读(219)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017