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();
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);
//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);
然后,使用glPolygonStipple来设置镂空的样式。
void glPolygonStipple(const GLubyte *mask);