您的位置:首页 > 其它

gl 绘制多边形的函数解析

2012-05-02 15:29 344 查看
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 第三课
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: