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. Spring @Conditional简单使用 以及 使用时注意事项一点

    @Conditional注解在类的方法中 @Conditional注解失效的一种原因 @Conditional注解在类上 手写的低配版@ConditionalOnClass Spring  @Cond ...

  2. oracle 删除服务sc delete Oracle

    oracle 删除服务sc delete OracleVssWriterorcl -----(oracle orcl vss writer service的服务名!)

  3. RocketMQ专题1:入门

    RocketMQ入门 源码和应用下载 ​ 这里以RocketMQ的4.3.0版本为例,本地环境为windows10,jdk1.8, maven3.2.1. 源码下载地址: http://mirrors ...

  4. 开源方案搭建可离线的精美矢量切片地图服务-6.Mapbox之.pbf字体库

    项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...

  5. Redis-发布与订阅

    发布与订阅(pub/sub)的特点是订阅者负责订阅频道发送者负责向频道发送二进制字符串消息.每当有消息发送至给定频道时,频道的所有订阅者都会收到消息 (发布和订阅命令) SUBSCRIBE : SUB ...

  6. MQ单一消息完整流程

    public class QueueManger { private static string QueuePath = @".\private$\{0}"; /// <su ...

  7. 撩课-Web大前端每天5道面试题-Day33

    1.CommonJS 中的 require/exports 和 ES6 中的 import/export 区别? CommonJS 模块的重要特性是加载时执行, 即脚本代码在 require 的时候, ...

  8. Outlook2013怎样自动答复电子邮件

    工具/原料 office2013或outlook2013 百度经验:jingyan.baidu.com 方法/步骤 1 首先我们创建自己的答复邮件.打开outlook2013,单击“开始”>“新 ...

  9. Maven构建的Spring项目需要哪些依赖?

    Maven构建的Spring项目需要哪些依赖? <!-- Spring依赖 --> <!-- 1.Spring核心依赖 --> <dependency> <g ...

  10. DRF序列化/反序列化

    反序列化(不推荐版):两个字段 一个为正序准备,一个为反序准备重写create update方法 1. 确定数据结构: 自己定义key book_obj = { "title": ...