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

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

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

源代码如下所示:

#include "stdafx.h"
#include <gl/glut.h>
#include <math.h>
//圆周率宏
#define GL_PI 3.1415f
//获取屏幕的宽度
GLint SCREEN_WIDTH=0;
GLint SCREEN_HEIGHT=0;
//设置程序的窗口大小
GLint windowWidth=400;
GLint windowHeight=300;
//绕x轴旋转角度
GLfloat xRotAngle=0.0f;
//绕y轴旋转角度
GLfloat yRotAngle=0.0f;
#define MODE_SOLID 1
#define MODE_LINE 2
#define MODE_POINTS 3
GLint iMode=MODE_SOLID;// 多边形的填充方式
GLboolean bEdgeFlag=GL_TRUE;//控制边的显示与否
//受支持的点大小范围
GLfloat sizes[2];
//受支持的点大小增量
GLfloat step;
//菜单回调函数
void processMenu(int value){switch(value){case 1:iMode=MODE_SOLID;break;case 2:iMode=MODE_LINE;break;case 3:iMode=MODE_POINTS;break;case 4:bEdgeFlag=GL_TRUE;break;case 5:bEdgeFlag=GL_FALSE;break;default:break;}//重新绘制glutPostRedisplay();
}
//显示回调函数
void renderScreen(void){GLfloat x,y,z,angle;int i;//把整个窗口清理为当前清理颜色:黑色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//将当前Matrix状态入栈glPushMatrix();//坐标系绕x轴旋转xRotAngleglRotatef(xRotAngle,1.0f,0.0f,0.0f);//坐标系绕y轴旋转yRotAngleglRotatef(yRotAngle,0.0f,1.0f,0.0f);//设置多边形正面和背面的填充模式 if(MODE_SOLID==iMode)glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);if(MODE_LINE==iMode)glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);if(MODE_POINTS==iMode)glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);x=0.0f;y=0.0f;z=0.0f;//进行平滑处理 glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH,GL_NICEST);glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH,GL_NICEST);glEnable(GL_POLYGON_SMOOTH);glHint(GL_POLYGON_SMOOTH,GL_NICEST);//绘制坐标系if(MODE_POINTS!=iMode){glColor3f(1.0f,1.0f,1.0f);glBegin(GL_LINES);glVertex3f(-80.0f,0.0f,0.0f);glVertex3f(80.0f,0.0f,0.0f);glVertex3f(0.0f,-80.0f,0.0f);glVertex3f(0.0f,80.0f,0.0f);glVertex3f(0.0f,0.0f,-80.0f);glVertex3f(0.0f,0.0f,80.0f);glEnd();glPushMatrix();glTranslatef(80.0f,0.0f,0.0f);glRotatef(90.0f,0.0f,1.0f,0.0f);glutWireCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,80.0f,0.0f);glRotatef(-90.0f,1.0f,0.0f,0.0f);glutWireCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,0.0f,80.0f);glRotatef(90.0f,0.0f,0.0f,1.0f);glutWireCone(3,6,10,10);glPopMatrix();}glColor3f(0.0f,1.0f,0.0f);glBegin(GL_TRIANGLES);//glPointSize(sizes[1]);glEdgeFlag(bEdgeFlag);glVertex2f(-20.0f, 20.0f);glEdgeFlag(GL_TRUE);glVertex2f(20.0f, 20.0f);glVertex2f(0.0f, 60.0f);glVertex2f(-20.0f,20.0f);glVertex2f(-60.0f,0.0f);glEdgeFlag(bEdgeFlag);glVertex2f(-20.0f,-20.0f);glEdgeFlag(GL_TRUE);glVertex2f(-20.0f,-20.0f);glVertex2f(0.0f, -60.0f);glEdgeFlag(bEdgeFlag);glVertex2f(20.0f, -20.0f);       glEdgeFlag(GL_TRUE);glVertex2f(20.0f, -20.0f);      glVertex2f(60.0f, 0.0f);glEdgeFlag(bEdgeFlag);glVertex2f(20.0f, 20.0f);glEdgeFlag(GL_TRUE);// Center square as two trianglesglEdgeFlag(bEdgeFlag);glVertex2f(-20.0f, 20.0f);glVertex2f(-20.0f,-20.0f);glVertex2f(20.0f, 20.0f);glVertex2f(-20.0f,-20.0f);glVertex2f(20.0f, -20.0f);glVertex2f(20.0f, 20.0f);glEdgeFlag(GL_TRUE);glEnd();//恢复压入栈的MatrixglPopMatrix();//交换两个缓冲区的指针glutSwapBuffers();
}
//设置Redering State
void setupRederingState(void){//设置清理颜色为黑色glClearColor(0.0f,0.0,0.0,1.0f);//设置绘画颜色为绿色glColor3f(0.0f,1.0f,0.0f);//使能深度测试glEnable(GL_DEPTH_TEST);//获取受支持的点大小范围glGetFloatv(GL_POINT_SIZE_RANGE,sizes);//获取受支持的点大小增量glGetFloatv(GL_POINT_SIZE_GRANULARITY,&step);printf("point size range:%f-%f\n",sizes[0],sizes[1]);printf("point step:%f\n",step);
}
//窗口大小变化回调函数
void changSize(GLint w,GLint h){//横宽比率GLfloat ratio;//设置坐标系为x(-100.0f,100.0f)、y(-100.0f,100.0f)、z(-100.0f,100.0f)GLfloat coordinatesize=100.0f;//窗口宽高为零直接返回if((w==0)||(h==0))return;//设置视口和窗口大小一致glViewport(0,0,w,h);//对投影矩阵应用随后的矩阵操作glMatrixMode(GL_PROJECTION);//重置当前指定的矩阵为单位矩阵 glLoadIdentity();ratio=(GLfloat)w/(GLfloat)h;//正交投影if(w<h)glOrtho(-coordinatesize,coordinatesize,-coordinatesize/ratio,coordinatesize/ratio,-coordinatesize,coordinatesize);elseglOrtho(-coordinatesize*ratio,coordinatesize*ratio,-coordinatesize,coordinatesize,-coordinatesize,coordinatesize);//对模型视图矩阵堆栈应用随后的矩阵操作glMatrixMode(GL_MODELVIEW);//重置当前指定的矩阵为单位矩阵 glLoadIdentity();
}//按键输入处理回调函数
void specialKey(int key,int x,int y){if(key==GLUT_KEY_UP){xRotAngle-=5.0f;}else if(key==GLUT_KEY_DOWN){xRotAngle+=5.0f;}else if(key==GLUT_KEY_LEFT){yRotAngle-=5.0f;}else if(key==GLUT_KEY_RIGHT){yRotAngle+=5.0f;}//重新绘制glutPostRedisplay();
}int main(int argc, char* argv[])
{int nModeMenu;int nEdgeMenu;int nMainMenu;//初始化glut glutInit(&argc,argv);//使用双缓冲区模式glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);//获取系统的宽像素SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);//获取系统的高像素SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);//创建窗口,窗口名字为OpenGL Star DemoglutCreateWindow("OpenGL Star Demo");//创建二级菜单nModeMenu=glutCreateMenu(processMenu);glutAddMenuEntry("Solid",1);glutAddMenuEntry("Outline",2);glutAddMenuEntry("Points",3);nEdgeMenu=glutCreateMenu(processMenu);glutAddMenuEntry("On",4);glutAddMenuEntry("Off",5);nMainMenu=glutCreateMenu(processMenu);glutAddSubMenu("Mode",nModeMenu);glutAddSubMenu("Edge",nEdgeMenu);//将菜单榜定到鼠标右键上glutAttachMenu(GLUT_RIGHT_BUTTON);//设置窗口大小glutReshapeWindow(windowWidth,windowHeight);//窗口居中显示glutPositionWindow((SCREEN_WIDTH-windowWidth)/2,(SCREEN_HEIGHT-windowHeight)/2);//窗口大小变化时的处理函数glutReshapeFunc(changSize);//设置显示回调函数 glutDisplayFunc(renderScreen);//设置按键输入处理回调函数glutSpecialFunc(specialKey);//设置全局渲染参数setupRederingState();glutMainLoop();return 0;
}

VS2012下基于Glut OpenGL glEdgeFlag示例程序:相关推荐

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

    模板测试是把像素存储在模板缓冲区的值与一个参考值进行比较.根据测试的结果,对模板缓冲区中得这个值进行相应的修改. Note:模板测试只有在存在模板缓冲区的情况下才会执行,如果不存在模板缓冲区,模板测试 ...

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

    OpenGL 使用GL_QUADS绘制四边形示例程序,显示效果如下所示. GL_QUADS连续点生成四边形的规则如下图所示: 源代码如下: // GlutQuadsDemo.cpp : 定义控制台应用 ...

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

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

  4. VS2012下基于Glut OpenGL GL_POLYGON示例程序:

    很多书介绍GL_POLYGON连续点生成多边形时这下点必须是凸多边形的,规则如下图所示.写个Demo验证了下似乎不是凸多边形的也可以. Demo的正面与背面显示效果: 源代码如下所示: // Glut ...

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

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

  6. VS2012下基于Glut OpenGL GL_POLYGON_STIPPLE示例程序:

    直线可以被画成虚线,而多边形则可以进行镂空. 首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭 ...

  7. VS2012下基于Glut OpenGL GL_QUAD_STRIP示例程序:

    OpenGL连续点通过GL_QUAD_STRIP生成四边形规则如下图所示: 演示程序效果如下图所示: 源代码如下所示: // GlutQuadStripDemo.cpp : 定义控制台应用程序的入口点 ...

  8. VS2012下基于Glut glRotatef glTranslatef示例程序:

    Demo使用glRotatef ,glTranslatef来实现一个太阳.地球.月亮运动的3D图形. 1.glTranslatef() --模型变换函数移动 voidglTranslatef(GLfl ...

  9. VS2012下基于Glut 绘制立方体示例程序:

    使用glBegin(GL_QUADS)绘制六个侧面来组成一个立方体:并使用glFrontFace(GL_CW).glFrontFace(GL_CCW)来设置每个面的正面:使用glColor3ub来设置 ...

最新文章

  1. android中menu菜单扩增_【已解决】Android添加Menu菜单
  2. js获取asp.net服务器端控件Label,TextBox,RadioButtonList,DropDownList的值
  3. Ubuntu:安装deb文件包
  4. MapReduce中Client提交Job源码分析
  5. 23设计模式简介笔记
  6. c语言创建链表存储10个数,C语言编写的建立单向int链表,连续输入10个结点创建链表,并实现在原链表中插入数字、删除数字、查找数字的功能...
  7. 第六章 设计程序架构 之 设计实现WebSocket策略
  8. mysql查询男生基本情况_MySQL数据库技术与应用:数据查询
  9. IIS和APACHE共用80端口的方法
  10. [AHOI 2009]chess 中国象棋
  11. ConcurrentHashMap内部原理浅析
  12. Nessus下载离线升级包all-2.0 .tar.gz方法
  13. 用计算机绘制三维设计图步骤,3d效果图一般制作步骤
  14. 线段树 树状数组 离散化相关例题
  15. NBUT 1225 NEW RDSP MODE I(找规律)(快速幂)
  16. 深入理解计算机系统(2.8)---浮点数的舍入,Java中的舍入例子以及浮点数运算(重要)
  17. IntelliJ IDEA像Eclipse一样打开工作空间,管理多个项目
  18. template不支持v-show
  19. 7-18 nii.gz文件的处理
  20. 2021年热门的10个IT技术职位以及如何招聘

热门文章

  1. 路由器与交换机的区别【知识普及】
  2. 华为机试HJ37:统计每个月兔子的总数(斐波那契数列)
  3. go list指针_「GCTT 出品」Go 语言机制之内存剖析
  4. php 动态 常量,PHP中的动态常量?
  5. java 私有静态类_java中,在私有的静态类中如何触发jbutton
  6. git 如何忽略掉文件夹_如何使git忽略某些文件或文件夹
  7. visio网络拓扑图 下载_Visio2019软件下载及安装教程
  8. 修改时间日期 linux,查看和修改 Linux 的时间和日期
  9. idea运行maven:No URLs will be polled as dynamic configuration sources
  10. 大型网站技术架构(读书笔记)