很多书介绍GL_POLYGON连续点生成多边形时这下点必须是凸多边形的,规则如下图所示。写个Demo验证了下似乎不是凸多边形的也可以。

Demo的正面与背面显示效果:

源代码如下所示:

// GlutPolygonDemo.cpp : 定义控制台应用程序的入口点。
//
#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;//是否打开不显示背面功能
GLint cullFace=0;
//是否打开深度测试功能
GLint depthTest=0;
//背面是采用线条描外框还是使用单色填充 
GLint outLine=0;
//菜单回调函数
void processMenu(int value){switch(value){case 1:depthTest=!depthTest;break;case 2:cullFace=!cullFace;case 3:outLine=!outLine;break;break;default:break;}//重新绘制glutPostRedisplay();
}
//显示回调函数
void renderScreen(void){GLfloat x,y,z,angle;//把整个窗口清理为当前清理颜色:黑色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(depthTest)glEnable(GL_DEPTH_TEST);//打开深度测试功能elseglDisable(GL_DEPTH_TEST);//关闭深度测试功能if(cullFace)glEnable(GL_CULL_FACE);//打开不显示背面功能elseglDisable(GL_CULL_FACE);//关闭不显示背面功能if(outLine)glPolygonMode(GL_BACK,GL_LINE);//多边形背部使用线条描框elseglPolygonMode(GL_BACK,GL_FILL);//多边形背部使用单色填充x=0.0f;y=0.0f;z=0.0f;//进行平滑处理 glEnable(GL_LINE_SMOOTH);glHint(GL_LINE_SMOOTH,GL_NICEST);//绘制坐标系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();//开始绘制两个三角形glBegin(GL_POLYGON);//红色绘制第一个四边形glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(0.0f,50.0f,0.0f);glVertex3f(25.0f,5.0f,0.0f);glVertex3f(5.0f,25.0f,0.0f);glVertex3f(50.0f,0.0f,0.0f);//结束绘三角形glEnd();//恢复压入栈的MatrixglPopMatrix();//交换两个缓冲区的指针glutSwapBuffers();
}
//设置Redering State
void setupRederingState(void){//设置清理颜色为黑色glClearColor(0.0f,0.0,0.0,1.0f);//设置绘画颜色为绿色glColor3f(0.0f,1.0f,0.0f);
}
//窗口大小变化回调函数
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[])
{//初始化glut glutInit(&argc,argv);//使用双缓冲区模式glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH);//获取系统的宽像素SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH);//获取系统的高像素SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);//创建窗口,窗口名字为OpenGL TriAngle DemoglutCreateWindow("OpenGL Polygon Demo");//菜单回调函数glutCreateMenu(processMenu);//添加菜单glutAddMenuEntry("Toggle depth test",1);glutAddMenuEntry("Toggle cull face",2);glutAddMenuEntry("Toggle back outline",3);//将菜单榜定到鼠标右键上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 GL_POLYGON示例程序:相关推荐

  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 glScissor示例程序:

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

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

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

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

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

  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. linux7开放3306端口,CentOS 7 开放3306端口访问
  2. 温故知新 javascript 正则表达式
  3. 有向图——强连通分量
  4. 学成在线--2.CMS前端页面查询开发
  5. .Net Core----关于MVC中TempData持久化问题
  6. docker push到私有仓库、pull
  7. 【干货】卷积神经网络Alex-Net、VGG-Nets、Network-In-Network案例分析
  8. Markdown初使用
  9. 银河麒麟桌面操作系统sp1 2203双硬盘ghost备份及手动分区还原
  10. E盾网络验证企业版离线版成品EXE DLL加密源码加密网络验证
  11. 机器人导论 学习笔记2 - 运动学(D-H模型)
  12. 锐龙R3 PRO 5450U性能怎么样?相当于什么水平级别档次?
  13. QT 中怎样实现延时 stop
  14. Vue生成二维码组件封装
  15. java发送邮件格式_java使用main函数进行邮件发送怎样设置邮件格式
  16. 如何在uni-app中使用vant组件?最细教学,还看不懂你来捶我
  17. 计算球体积和球表面积
  18. 大数据的应用场景都有哪些(医疗篇)
  19. js判断网络链接的四种方法
  20. axios库读不到cookie_axios中cookie跨域及相关配置示例详解

热门文章

  1. ***制作显身网络 公开销售***挑战法律界线
  2. OpenCV-获取图像中圆线上的数据
  3. mysql 替换全部标内容_Mysql SQL 替换标签内容
  4. 有linux服务器用来干什么用的,linux集群能干什么
  5. C#图解教程读书笔记(结构)
  6. 武大金融工程和计算机专业,求解!武大的金融工程可以排第几
  7. maxcompute操作_MaxCompute问答整理之9月
  8. 如何查看有没有django及版本
  9. csv批量读取测试数据
  10. linux telnet无法连接,奇怪的问题:telnet无法连接另一台server的正常的开放端口