【原文:http://blog.sina.com.cn/s/blog_8e0502b7010198o5.html】
在OpenGL中面的基本单位是凸多边形。而一般绘制时,多边形的正面、反面两个面均以填充形式进行绘制。下面介绍绘制方式可以如何改变。(材质贴图内容太多以后再展开写)
下面给出一个实例,来看看这三个函数的具体功能:
——————————————————————————————————————
依然将下面的代码插入第一节程序glFlush();之前
glPolygonMode(GL_FRONT,GL_POINT);//正面点形式
glBegin(GL_QUADS); //画
glEnd(); //形
glPolygonMode(GL_FRONT,GL_LINE); //正面轮廓形式
glBegin(GL_QUADS); //画
glEnd(); //形
glPolygonMode(GL_FRONT,GL_FILL); //还原默认值
glBegin(GL_QUADS); //画
glEnd(); //形
glPolygonMode(GL_FRONT,GL_LINE); //正面轮廓形式
glEnable(GL_CULL_FACE); //启用面剔除功能
glCullFace(GL_FRONT); //只剔除正面
glBegin(GL_QUADS); //画
glEnd();
glCullFace(GL_BACK); //只剔除背面
glBegin(GL_QUADS); //画
glEnd();
glCullFace(GL_FRONT_AND_BACK); //两面剔除
glBegin(GL_QUADS); //画
glEnd();
glFrontFace(GL_CW); //反转顶点方向
glPolygonMode(GL_FRONT,GL_LINE);
glCullFace(GL_FRONT); //只剔除正面
glBegin(GL_QUADS); //画
glEnd();
glCullFace(GL_BACK); //只剔除背面
glBegin(GL_QUADS); //画
glEnd();
glCullFace(GL_FRONT_AND_BACK); //两面剔除
glBegin(GL_QUADS); //画
glEnd();
glDisable(GL_CULL_FACE); //禁用剔除功能
——————————————————————————————————————++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 运行程序:
第一行,依次是点、轮廓和填充形式。
第二行,启用剔除设定正面是填充、背面轮廓,依次剔除正面、背面和两面。
第三行,启用并设定反转,依次剔除正面、背面和两面。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
——————————————————————————————————————
将下面的代码插入第一节程序glFlush();之前
GLubyte polygon[] = { //看得出这数组是个“面”字吗?下面用二进制翻译一下
0x00,0x00,0x00,0x00, //0000 0000 0000 0000 0000 0000 0000 0000
0x00,0x00,0x00,0x00, //0000 0000 0000 0000 0000 0000 0000 0000
0x00,0x00,0x00,0x00, //0000 0000 0000 0000 0000 0000 0000 0000
0x0E,0x00,0x00,0x70, //0000 1110 0000 0000 0000 0000 0111 0000
0x0F,0xFF,0xFF,0xF0, //0000 1111 1111 1111 1111 1111 1111 0000
0x0F,0xFF,0xFF,0xF0, //0000 1111 1111 1111 1111 1111 1111 0000
0x0F,0xFF,0xFF,0xF0, //0000 1111 1111 1111 1111 1111 1111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0E,0x3F,0xFC,0x70, //0000 1110 0011 1111 1111 1100 0111 0000
0x0E,0x3F,0xFC,0x70, //0000 1110 0011 1111 1111 1100 0111 0000
0x0E,0x3F,0xFC,0x70, //0000 1110 0011 1111 1111 1100 0111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0E,0x3F,0xFC,0x70, //0000 1110 0011 1111 1111 1100 0111 0000
0x0E,0x3F,0xFC,0x70, //0000 1110 0011 1111 1111 1100 0111 0000
0x0E,0x3F,0xFC,0x70, //0000 1110 0011 1111 1111 1100 0111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0E,0x38,0x1C,0x70, //0000 1110 0011 1000 0001 1100 0111 0000
0x0F,0xFF,0xFF,0xF0, //0000 1111 1111 1111 1111 1111 1111 0000
0x0F,0xFF,0xFF,0xF0, //0000 1111 1111 1111 1111 1111 1111 0000
0x0F,0xFF,0xFF,0xF0, //0000 1111 1111 1111 1111 1111 1111 0000
0x00,0x0F,0x00,0x00, //0000 0000 0000 1111 0000 0000 0000 0000
0x00,0x0F,0x00,0x00, //0000 0000 0000 1111 0000 0000 0000 0000
0x00,0x07,0x80,0x00, //0000 0000 0000 0111 1000 0000 0000 0000
0x3F,0xFF,0xFF,0xFC, //0011 1111 1111 1111 1111 1111 1111 1100
0x3F,0xFF,0xFF,0xFC, //0011 1111 1111 1111 1111 1111 1111 1100
0x3F,0xFF,0xFF,0xFC, //0011 1111 1111 1111 1111 1111 1111 1100
0x00,0x00,0x00,0x00, //0000 0000 0000 0000 0000 0000 0000 0000
0x00,0x00,0x00,0x00 //0000 0000 0000 0000 0000 0000 0000 0000
};
glEnable(GL_POLYGON_STIPPLE); //启用点画多边形功能
glPolygonStipple(polygon); //定义polygon数组为当前点画模式
glBegin(GL_QUADS); //画
glEnd(); //形
glDisable(GL_POLYGON_STIPPLE); //关闭点画多边形功能
——————————————————————————————————————
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
运行程序:
很犀利的一百个“面”字。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
——————————————————————————————————————
glBegin(GL_TRIANGLES); //给出一个凹多边形
glEnd();
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//改用轮廓形式,重画
glBegin(GL_TRIANGLES);
glEnd();
glBegin(GL_TRIANGLES); //使用glEdgeFlag()后,重画
glEnd();
——————————————————————————————————————
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
运行程序:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本节知识点:
1、面细节简介
2、相关函数的使用