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 第三课
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 第三课
相关文章推荐
- gl 绘制多边形的函数解析 .
- oepngl绘制变动的多边形之glRotatef函数的利用
- minetest源码解析四:game界面刷新绘制流程及核心函数介绍
- OpenGL函数解析之glMatrixMode(GLenum mode)
- openCV学习笔记(4):绘制直方图和calcHist()函数、normalize()函数的解析
- 7080-2.Python数据可视化:3D图绘制函数解析
- SetWindowRgn函数应用--截图,绘制多边形窗体
- OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(2)--提高篇
- error LNK2019: 无法解析的外部符号 ___glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 1>GEARS.obj : error LNK2019: 无法解析的外部符号 ___gl
- OpenCv学习笔记(七)---OpenCv中的基本绘图函数,圆,椭圆,线段,矩形,多边形的绘制(1)
- glPolygonOffset 函数解析
- 各种多边形绘制函数
- 用线框模式绘制多边形 glPolygonMode
- canvas 上绘制正多边形函数
- opencv1.0 CvSolve函数深度解析
- linux-011文件系统节点操作函数解析
- x264部分函数解析
- 高德地图 SDK 的应用 02:多边形区域图的手动重绘制
- mmap()函数解析
- Android视图绘制流程完全解析,带你一步步深入了解View(二)