zoukankan      html  css  js  c++  java
  • gl 绘制多边形的函数解析 分类: OpenGL(转)

    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);
    更多参考:http://www.cppblog.com/doing5552/archive/2009/01/08 第三课
  • 相关阅读:
    elasticsearch安装ik分词器
    原来你是这样的JAVA[03]-继承、多态、抽象类
    JAVA入门[23]-SpringBoot配置Swagger2
    原来你是这样的JAVA[01]-基础一瞥
    springboot + @scheduled 多任务并发
    chrome解决http自动跳转https问题
    jquery.uploadify+spring mvc实现上传图片
    JAVA POI导出excel
    使用ztree展示树形菜单结构
    shiro入门示例
  • 原文地址:https://www.cnblogs.com/aminxu/p/4704196.html
Copyright © 2011-2022 走看看