glEdgeFlag (GLboolean flag)表示一个顶点是否应该被认为是多边形的一条边界边的起点。flag为GL_TRUE后面的点都被认为是边界上的点,flag为GL_FALSE则之后的点不是边界上的点。

Demo使用菜单来决定四角星的四个凹进去的点是否是边界边的起点。当菜单选中凹进去的四个点为边界上的点时,使用多边形的填充模式为GL_LINE时如下图所示:

当菜单选中凹进去的四个点不为边界上的点时,使用多边形的填充模式为GL_LINE时如下图所示:

源代码如下所示:

  1. #include "stdafx.h"
  2. #include <gl/glut.h>
  3. #include <math.h>
  4. //圆周率宏
  5. #define GL_PI 3.1415f
  6. //获取屏幕的宽度
  7. GLint SCREEN_WIDTH=0;
  8. GLint SCREEN_HEIGHT=0;
  9. //设置程序的窗口大小
  10. GLint windowWidth=400;
  11. GLint windowHeight=300;
  12. //绕x轴旋转角度
  13. GLfloat xRotAngle=0.0f;
  14. //绕y轴旋转角度
  15. GLfloat yRotAngle=0.0f;
  16. #define MODE_SOLID 1
  17. #define MODE_LINE 2
  18. #define MODE_POINTS 3
  19. GLint iMode=MODE_SOLID;// 多边形的填充方式
  20. GLboolean bEdgeFlag=GL_TRUE;//控制边的显示与否
  21. //受支持的点大小范围
  22. GLfloat sizes[2];
  23. //受支持的点大小增量
  24. GLfloat step;
  25. //菜单回调函数
  26. void processMenu(int value){
  27. switch(value){
  28. case 1:
  29. iMode=MODE_SOLID;
  30. break;
  31. case 2:
  32. iMode=MODE_LINE;
  33. break;
  34. case 3:
  35. iMode=MODE_POINTS;
  36. break;
  37. case 4:
  38. bEdgeFlag=GL_TRUE;
  39. break;
  40. case 5:
  41. bEdgeFlag=GL_FALSE;
  42. break;
  43. default:
  44. break;
  45. }
  46. //重新绘制
  47. glutPostRedisplay();
  48. }
  49. //显示回调函数
  50. void renderScreen(void){
  51. GLfloat x,y,z,angle;
  52. int i;
  53. //把整个窗口清理为当前清理颜色:黑色
  54. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  55. //将当前Matrix状态入栈
  56. glPushMatrix();
  57. //坐标系绕x轴旋转xRotAngle
  58. glRotatef(xRotAngle,1.0f,0.0f,0.0f);
  59. //坐标系绕y轴旋转yRotAngle
  60. glRotatef(yRotAngle,0.0f,1.0f,0.0f);
  61. //设置多边形正面和背面的填充模式
  62. if(MODE_SOLID==iMode)
  63. glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  64. if(MODE_LINE==iMode)
  65. glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  66. if(MODE_POINTS==iMode)
  67. glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
  68. x=0.0f;
  69. y=0.0f;
  70. z=0.0f;
  71. //进行平滑处理 
  72. glEnable(GL_POINT_SMOOTH);
  73. glHint(GL_POINT_SMOOTH,GL_NICEST);
  74. glEnable(GL_LINE_SMOOTH);
  75. glHint(GL_LINE_SMOOTH,GL_NICEST);
  76. glEnable(GL_POLYGON_SMOOTH);
  77. glHint(GL_POLYGON_SMOOTH,GL_NICEST);
  78. //绘制坐标系
  79. if(MODE_POINTS!=iMode){
  80. glColor3f(1.0f,1.0f,1.0f);
  81. glBegin(GL_LINES);
  82. glVertex3f(-80.0f,0.0f,0.0f);
  83. glVertex3f(80.0f,0.0f,0.0f);
  84. glVertex3f(0.0f,-80.0f,0.0f);
  85. glVertex3f(0.0f,80.0f,0.0f);
  86. glVertex3f(0.0f,0.0f,-80.0f);
  87. glVertex3f(0.0f,0.0f,80.0f);
  88. glEnd();
  89.  
  90. glPushMatrix();
  91. glTranslatef(80.0f,0.0f,0.0f);
  92. glRotatef(90.0f,0.0f,1.0f,0.0f);
  93. glutWireCone(3,6,10,10);
  94. glPopMatrix();
  95.  
  96. glPushMatrix();
  97. glTranslatef(0.0f,80.0f,0.0f);
  98. glRotatef(-90.0f,1.0f,0.0f,0.0f);
  99. glutWireCone(3,6,10,10);
  100. glPopMatrix();
  101.  
  102. glPushMatrix();
  103. glTranslatef(0.0f,0.0f,80.0f);
  104. glRotatef(90.0f,0.0f,0.0f,1.0f);
  105. glutWireCone(3,6,10,10);
  106. glPopMatrix();
  107. }
  108. glColor3f(0.0f,1.0f,0.0f);
  109. glBegin(GL_TRIANGLES);
  110. //glPointSize(sizes[1]);
  111. glEdgeFlag(bEdgeFlag);
  112. glVertex2f(-20.0f, 20.0f);
  113. glEdgeFlag(GL_TRUE);
  114. glVertex2f(20.0f, 20.0f);
  115. glVertex2f(0.0f, 60.0f);
  116.  
  117. glVertex2f(-20.0f,20.0f);
  118. glVertex2f(-60.0f,0.0f);
  119. glEdgeFlag(bEdgeFlag);
  120. glVertex2f(-20.0f,-20.0f);
  121. glEdgeFlag(GL_TRUE);
  122.  
  123. glVertex2f(-20.0f,-20.0f);
  124. glVertex2f(0.0f, -60.0f);
  125. glEdgeFlag(bEdgeFlag);
  126. glVertex2f(20.0f, -20.0f);
  127. glEdgeFlag(GL_TRUE);
  128.  
  129. glVertex2f(20.0f, -20.0f);
  130. glVertex2f(60.0f, 0.0f);
  131. glEdgeFlag(bEdgeFlag);
  132. glVertex2f(20.0f, 20.0f);
  133. glEdgeFlag(GL_TRUE);
  134.  
  135. // Center square as two triangles
  136. glEdgeFlag(bEdgeFlag);
  137. glVertex2f(-20.0f, 20.0f);
  138. glVertex2f(-20.0f,-20.0f);
  139. glVertex2f(20.0f, 20.0f);
  140.  
  141. glVertex2f(-20.0f,-20.0f);
  142. glVertex2f(20.0f, -20.0f);
  143. glVertex2f(20.0f, 20.0f);
  144. glEdgeFlag(GL_TRUE);
  145. glEnd();
  146.  
  147. //恢复压入栈的Matrix
  148. glPopMatrix();
  149. //交换两个缓冲区的指针
  150. glutSwapBuffers();
  151. }
  152. //设置Redering State
  153. void setupRederingState(void){
  154. //设置清理颜色为黑色
  155. glClearColor(0.0f,0.0,0.0,1.0f);
  156. //设置绘画颜色为绿色
  157. glColor3f(0.0f,1.0f,0.0f);
  158. //使能深度测试
  159. glEnable(GL_DEPTH_TEST);
  160. //获取受支持的点大小范围
  161. glGetFloatv(GL_POINT_SIZE_RANGE,sizes);
  162. //获取受支持的点大小增量
  163. glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);
  164. printf("point size range:%f-%f\n",sizes[0],sizes[1]);
  165. printf("point step:%f\n",step);
  166. }
  167. //窗口大小变化回调函数
  168. void changSize(GLint w,GLint h){
  169. //横宽比率
  170. GLfloat ratio;
  171. //设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)
  172. GLfloat coordinatesize=100.0f;
  173. //窗口宽高为零直接返回
  174. if((w==0)||(h==0))
  175. return;
  176. //设置视口和窗口大小一致
  177. glViewport(0,0,w,h);
  178. //对投影矩阵应用随后的矩阵操作
  179. glMatrixMode(GL_PROJECTION);
  180. //重置当前指定的矩阵为单位矩阵 
  181. glLoadIdentity();
  182. ratio=(GLfloat)w/(GLfloat)h;
  183. //正交投影
  184. if(w<h)
  185. glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);
  186. else
  187. glOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);
  188. //对模型视图矩阵堆栈应用随后的矩阵操作
  189. glMatrixMode(GL_MODELVIEW);
  190. //重置当前指定的矩阵为单位矩阵 
  191. glLoadIdentity();
  192. }
  193.  
  194. //按键输入处理回调函数
  195. void specialKey(int key,int x,int y){
  196.  
  197. if(key==GLUT_KEY_UP){
  198. xRotAngle-=5.0f;
  199. }
  200. else if(key==GLUT_KEY_DOWN){
  201. xRotAngle+=5.0f;
  202. }
  203. else if(key==GLUT_KEY_LEFT){
  204. yRotAngle-=5.0f;
  205. }
  206. else if(key==GLUT_KEY_RIGHT){
  207. yRotAngle+=5.0f;
  208. }
  209. //重新绘制
  210. glutPostRedisplay();
  211. }
  212.  
  213. int main(int argc, char* argv[])
  214. {
  215. int nModeMenu;
  216. int nEdgeMenu;
  217. int nMainMenu;
  218. //初始化glut
  219. glutInit(&argc,argv);
  220. //使用双缓冲区模式
  221. glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);
  222. //获取系统的宽像素
  223. SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);
  224. //获取系统的高像素
  225. SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);
  226. //创建窗口,窗口名字为OpenGL Star Demo
  227. glutCreateWindow("OpenGL Star Demo");
  228. //创建二级菜单
  229. nModeMenu=glutCreateMenu(processMenu);
  230. glutAddMenuEntry("Solid",1);
  231. glutAddMenuEntry("Outline",2);
  232. glutAddMenuEntry("Points",3);
  233. nEdgeMenu=glutCreateMenu(processMenu);
  234. glutAddMenuEntry("On",4);
  235. glutAddMenuEntry("Off",5);
  236. nMainMenu=glutCreateMenu(processMenu);
  237. glutAddSubMenu("Mode",nModeMenu);
  238. glutAddSubMenu("Edge",nEdgeMenu);
  239. //将菜单榜定到鼠标右键上
  240. glutAttachMenu(GLUT_RIGHT_BUTTON);
  241. //设置窗口大小
  242. glutReshapeWindow(windowWidth,windowHeight);
  243. //窗口居中显示
  244. glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);
  245. //窗口大小变化时的处理函数
  246. glutReshapeFunc(changSize);
  247. //设置显示回调函数
  248. glutDisplayFunc(renderScreen);
  249. //设置按键输入处理回调函数
  250. glutSpecialFunc(specialKey);
  251. //设置全局渲染参数
  252. setupRederingState();
  253. glutMainLoop();
  254. return 0;
  255. }

VS2012下基于Glut OpenGL glEdgeFlag示例程序:的更多相关文章

  1. VS2012下基于Glut OpenGL glDepthMask示例程序:

    glDepthMask (GLboolean flag)函数可以决定将他之后的数据不写入深度缓冲区.当flag为GL_TRUE时之后的数据不写入深度缓冲区,即使启用了深度缓冲区测试功能. 使用上一个D ...

  2. VS2012下基于Glut OpenGL glScissor示例程序:

    剪裁测试用于限制绘制区域.我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃.换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改.有的朋友可能 ...

  3. VS2012下基于Glut 矩阵变换示例程序2:

    在VS2012下基于Glut 矩阵变换示例程序:中我们在绘制甜圈或者圆柱时使用矩阵对相应的坐标进行变换后自己绘制甜圈或者圆柱.我们也可以使用glLoadMatrixf.glLoadMatrixd载入变 ...

  4. VS2012下基于Glut 矩阵变换示例程序:

    也可以使用我们自己的矩阵运算来实现OpenGL下的glTranslatef相应的旋转变换.需要注意的是OpenGL下的矩阵是列优先存储的. 示例通过矩阵运算使得圆柱或者甜圈自动绕Y轴旋转,可以单击鼠标 ...

  5. 使用VS2012开发基于Office 2013的AddIn程序

    默认VS2012开发的Office Add是基于2010的,如下所示: 如果你机器上安装的Office版本是2013,那么使用VS2012创建的工程是无法运行的,弹出如下的错误: 那么此时怎么办呢?将 ...

  6. .NET Core初体验 - 在Mac下运行第一个Web示例程序

    要说最近两天程序猿之间最喜欢吹水的事是什么?那绝壁是甲骨文要放弃Java!简直做梦都要笑醒!由于公司的产品线全面转向Java,最近几个月也一直在苦学Java技术.已经默默决定了,如果消息证实是真的,我 ...

  7. 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)

    部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序   在下载的Istio安装包的samples目录中包含了示例应用程序. ...

  8. 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序

    小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...

  9. Windows7+VS2012下OpenGL 4的环境配置

    系统环境 Windows 7 Ultimate x64,Visual Studio Ultimate 2012 Update 4,和一块支持OpenGL 4.x的显卡. 准备工作 首先用GPU Cap ...

随机推荐

  1. SqlDataReader的关闭问题

    原文:SqlDataReader的关闭问题 昨天一个朋友使用Repeater绑定数据源时,老是出现"阅读器关闭时尝试调用 FieldCount 无效."错误. 我看了他的代码,使用 ...

  2. OpenGL入门【1 高速入门】

    // OpenGL.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include &l ...

  3. 安装Codeception框架

    安装Codeception框架 打开终端,进入项目根目录: composer require "codeception/codeception:*" 安装完成,在vendor目录会 ...

  4. linux有用技巧:使用快照制作虚拟机

    在日常的学习其中,假设遇到了集群和负载均衡类的实验,须要用到大量的虚拟机,假设一个一个的去创建,显然是很费力和低效的.所以今天交给大家怎样用快照来制作虚拟机.想要多少给你多少^_^.仅仅要内存够用! ...

  5. Spring之SpringMVC的RequestToViewNameTranslator(源码)分析

    前言 SpringMVC如果在处理业务的过程中发生了异常,这个时候是没有一个完整的ModelAndView对象返回的,它应该是怎么样处理呢?或者说应该怎么去获取一个视图然后去展示呢.下面就是要讲的Re ...

  6. [翻译]如何编写GIMP插件(二)

    写在前面: 本人翻译并不专业,甚至英语不好,翻译内容仅供参考.由于博主是边学边翻译,所以不能保证翻译的准确性和正确性,如果可以,请查看原版学习,本文仅作学习记录之用. <How to write ...

  7. SQL SERVER存储过程生成字母+数字的编码

    公司内设备管理系统中设备建账功能,功能目的是对新进设备进行记录并入库.其中设备编号一项定义为自己修改(查看之前的设备号,取一个不重复的值来填写),感觉特别麻烦!用存储过程自动生成编码岂不是更效率. 需 ...

  8. mysql的架构

    和其他数据库相比,mysql有点与众不同,它的架构可以在多种不同场景中应用并发挥好的作用,而理解其设计是发挥好作用的先决条件 每当我们在想起mysql的逻辑架构师,我们可以构造一副mysql各组件之间 ...

  9. HDInsight-Hadoop现实(两)传感器数据分析

    HDInsight-Hadoop现实(两)传感器数据分析 简要 现在,含传感器非常个人和商用设备收集来自物理世界的信息.例如.大多数手机都有 GPS.健身器材可以跟踪的步骤,你去数,恒温控制器可以监视 ...

  10. Python语言在企业级应用上的十大谬误

    英文原文:https://www.paypal-engineering.com/2014/12/10/10-myths-of-enterprise-python/ 翻译原文:http://www.os ...