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. 最短路径算法----floyd(转)

    一.Floyd算法 假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s ...

  2. MySQL进程-状态等参数详解

    查看连接 mysql -uroot -p123456 -e "show processlist;" 查看正在执行的sql语句 mysql -uroot -p123456 -e &q ...

  3. Oracle存储过程编译卡死的解决方法

    转自: https://www.cnblogs.com/liang-ling/p/5395249.html 解决方法如下: 1:查V$DB_OBJECT_CACHE SELECT * FROM V$D ...

  4. C#图片处理类

    转载來源:简书 转载作者:幻凌风 转载来源:https://www.jianshu.com/p/e1bab83e87ce using System; using System.Collections; ...

  5. Linux-mkdosfs格式化磁盘命令(15)

    名称:mkdosfs 使用:mkdosfs [块设备名称] 说明: 将一个块设备格式化为DOS磁盘类型 例: mkdosfs /dev/memblock //将memblock块设备格式化为dos磁盘 ...

  6. mybatis-plus排除非表中字段

    使用 transient 修饰 private transient String noColumn; 使用 static 修饰 private static String noColumn; 使用 T ...

  7. HTML DOM 知识点整理(一)—— Document对象

    一.DOM对象 DOM对象整体包括: HTML DOM Document对象 HTML DOM 元素对象 HTML DOM 属性对象 HTML DOM 事件对象 HTML DOM Console 对象 ...

  8. centos7下快速安装Nginx服务器

    1.添加源 默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了Centos的源地址.因此可以如下执行命令添加源: sudo rpm -Uvh http://nginx.org/pa ...

  9. python实现贪婪算法解决01背包问题

    一.背包问题 01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2至Wn,与之相对应的价值为P1,P2至Pn.01背包是背包问题中最简单的问题.01背包的约束条件是给定几种物 ...

  10. node 搭建静态服务

    对于Node.js新手,搭建一个静态资源服务器是个不错的锻炼,从最简单的返回文件或错误开始,渐进增强,还可以逐步加深对http的理解. 基本功能 不急着写下第一行代码,而是先梳理一下就基本功能而言有哪 ...