http://blog.csdn.net/zhongjling/article/details/7528091

1,所谓正反面

glFrontFace(GL_CCW);  // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
     glFrontFace(GL_CW);   // 设置CW方向为“正面”,CW即ClockWise,顺时针

如果顶点标识顺序与上边设置不一致,则会认为当前的面(眼前)为该图形的背面。

比如画一个三角形 vertex={( 1,0) ,  ( 0,1), (-1,0)}

如果 glFrontFace(GL_CCW); 逆时针为正面, 顶点标识indices={0,1,2} 才能正常显示 ,如果indices={2,1,0}则图形背面向外,显示图形的背面。

2. 绘制方式

glPolygonMode

 

  简介

 
  glPolygonMode函数用于控制多边形的显示方式。
 
  原型是:void glPolygonMode(GLenum face,GLenum mode);

参数

  face这个参数确定显示模式将适用于物体的哪些部分,控制多边形的正面和背面的绘图模式:
 
  GL_FRONT表示显示模式将适用于物体的前向面(也就是物体能看到的面)
 
  GL_BACK表示显示模式将适用于物体的后向面(也就是物体上不能看到的面)
 
  GL_FRONT_AND_BACK表示显示模式将适用于物体的所有面
 
  mode这个参数确定选中的物体的面以何种方式显示(显示模式):
 
  GL_POINT表示只显示顶点,多边形用点显示
 
  GL_LINE表示显示线段,多边形用轮廓显示
 
  GL_FILL表示显示面,多边形采用填充形式
 
  例:
 
  glPolygonMode(GL_FRONT, GL_LINE);表示物体的前向面用线段显示
 
  需要特别注意的是OpenGL3.1只接受GL_FRONT_AND_BACK作为face的值,并且不管是多边形的正面还是背面都以相同的方式渲染。
 
为了更加明白以上2者(正反面和绘制方式)的直观意义,特举例如下:
      在display()代码里加入:
    glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
     glPolygonMode(GL_BACK, GL_LINE);   // 设置反面为线形模式
     glFrontFace(GL_CCW);               // 设置逆时针方向为正面
     glBegin(GL_POLYGON);               // 按逆时针绘制一个正方形,在左下方
         glVertex2f(-50.0f, -50.0f);
         glVertex2f(0.0f, -50.0f);
         glVertex2f(0.0f, 0.0f);
         glVertex2f(-50.0f, 0.0f);
     glEnd();

glBegin(GL_POLYGON);               // 按顺时针绘制一个正方形,在右上方
         glVertex2f(0.0f, 0.0f);
         glVertex2f(0.0f, 50.0f);
         glVertex2f(50.0f, 50.0f);
         glVertex2f(50.0f, 0.0f);
     glEnd();

   
分析代码:后面这个右上方的四边形,可知其是按照顺时针布置顶点的,但是我们目前设置的是以逆时针为正面,那么运行的结果是什么呢?答,我们看到的是其背面。而背面是线形模式,我们看到的应该是线。  当然,左下角的应该是正面,而且是填充起来了的。
效果图如下:
 
 
 
 
3,剔除某些面
  glEnable(GL_CULL_FACE);
  glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。
   对于剔除,特举例如下:
在dispaly函数添加如下代码:
   glFrontFace(GL_CCW);
    //glCullFace(GL_BACK);  
    //glEnable(GL_CULL_FACE);
   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
        glBegin(GL_QUADS);
。。。这里面是画个立方体的6个表面。逆时针。
       glEnd();
在有   glCullFace(GL_BACK);  glEnable(GL_CULL_FACE);这2句的情况下,图形效果如下:
 
在没有  glCullFace(GL_BACK);  glEnable(GL_CULL_FACE);这2句的情况下,图形效果如下:
 
4,镂空某些面
  首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。
  然后,使用glPolygonStipple来设置镂空的样式。
    void glPolygonStipple(const GLubyte *mask);

gl 绘制多边形的函数解析 分类: OpenGL(转)的更多相关文章

  1. [WebGL入门]十四,绘制多边形

    注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外,鄙人webgl研究还不够深入.一些专业词语,假设翻译有误,欢迎大家 ...

  2. 【Silverlight】Bing Maps学习系列(五):绘制多边形(Polygon)图形(转)

    [Silverlight]Bing Maps学习系列(五):绘制多边形(Polygon)图形 Bing Maps Silverlight Control支持用户自定义绘制多边形(Polygon)图形, ...

  3. 封装 用canvas绘制直线的函数--面向对象

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  5. 用线框模式绘制多边形 glPolygonMode

    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBegin(GL_TRIANGLES);//开始以g_ViewMode模式绘制 glColor3ub(182. ...

  6. PHP json_decode 函数解析 json 结果为 NULL 的解决方法

    在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数 ...

  7. Matlab中bsxfun和unique函数解析

    一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是”applies an element-b ...

  8. socket使用TCP协议时,send、recv函数解析以及TCP连接关闭的问题

    Tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下, send函数的过程是将应用程序请求发送的数 ...

  9. sigaction函数解析

    http://blog.chinaunix.net/uid-1877180-id-3011232.html sigaction函数解析  sigaction函数的功能是检查或修改与指定信号相关联的处理 ...

随机推荐

  1. Spark(1.6.1) Sql 编程指南+实战案例分析

    首先看看从官网学习后总结的一个思维导图 概述(Overview) Spark SQL是Spark的一个模块,用于结构化数据处理.它提供了一个编程的抽象被称为DataFrames,也可以作为分布式SQL ...

  2. 几种常见算法的Python实现

    1.选择排序 选择排序是一种简单直观的排序算法.它的原理是这样:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的后 ...

  3. HTTP 无法注册URL 进程不具有命名空间的访问权限

    写WCF时在 host.Open(); 报错:HTTP 无法注册 URL http://+:9999/CalculatorService/.进程不具有此命名空间的访问权限(有关详细信息,请参见 htt ...

  4. 在MVC应用程序中,怎样删除上传的文件

    在ASP.NET MVC应用程序中,怎样删除上传的文件. 由于上传时,真正文件是存储在应用程序某一目录,在数据库表中,只是存储其基本信息.在删除时,需要注意一下,由于没有事务可操作.Insus.NET ...

  5. 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

    第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  ...

  6. 动态加载JS函数

    一般性的,当我们需要加载js文件的时候都会使用script标签来实现,类似于如下代码: 代码如下: <script type="text/javascript" src=&q ...

  7. github小白上传本地代码及更新代码到GitHub及华为云教程

    上传本地代码 第一步:去github上创建自己的Repository,创建页面如下图所示: 红框为新建的仓库的https地址 第二步: echo "# Test" >> ...

  8. Java - equals方法

    java提高篇(十三)-----equals()方法总结 equal和==区别 ==比较对象基于内存引用,两个引用完全相同返回true Java 语言里的 equals方法其实是交给开发者去覆写的,让 ...

  9. HDU6113

    度度熊的01世界 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  10. git中的ssh和https方式的使用(gitee为例)

    在使用git管理代码,或者使用github,国内的码云(gitee)的时候,有两种方式可以使用,分别是https和ssh,以下均使用gitee为例. ssh方式 配置ssh,如果不配置ssh的话,cl ...