直线可以被画成虚线,而多边形则可以进行镂空。

首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。

然后,使用glPolygonStipple来设置镂空的样式。

void glPolygonStipple(const GLubyte *mask);

其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。

Demo的显示效果如下:可以发现即使是在旋转坐标系时图案还是平面填充的,和纹理不一样。

源代码如下所示:

// GlutPolygonStippleDemo.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <gl/glut.h>
#include <math.h>//圆周率宏
#define GL_PI 3.1415f
GLubyte stippledata[128] = { //第一个矩形点画模式的mask值
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,
0x00, 0x00, 0xff, 0xff,0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00,
};
GLubyte flydata[128] = { //第二个矩形点画模式的mask值
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x03, 0x80, 0x01, 0xC0,
0x06, 0xC0, 0x03, 0x60,
0x04, 0x60, 0x06, 0x20,
0x04, 0x30, 0x0C, 0x20,
0x04, 0x18, 0x18, 0x20,
0x04, 0x0C, 0x30, 0x20,
0x04, 0x06, 0x60, 0x20,
0x44, 0x03, 0xC0, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,
0x44, 0x01, 0x80, 0x22,0x66, 0x01, 0x80, 0x66,
0x33, 0x01, 0x80, 0xCC,
0x19, 0x81, 0x81, 0x98,
0x0C, 0xC1, 0x83, 0x30,
0x07, 0xe1, 0x87, 0xe0,
0x03, 0x3f, 0xfc, 0xc0,
0x03, 0x31, 0x8c, 0xc0,
0x03, 0x33, 0xcc, 0xc0,
0x06, 0x64, 0x26, 0x60,
0x0c, 0xcc, 0x33, 0x30,
0x18, 0xcc, 0x33, 0x18,
0x10, 0xc4, 0x23, 0x08,
0x10, 0x63, 0xC6, 0x08,
0x10, 0x30, 0x0c, 0x08,
0x10, 0x18, 0x18, 0x08,
0x10, 0x00, 0x00, 0x08,
};//获取屏幕的宽度
GLint SCREEN_WIDTH=0;
GLint SCREEN_HEIGHT=0;
//设置程序的窗口大小
GLint windowWidth=400;
GLint windowHeight=400;
//绕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(0.0f,0.0f,1.0f);glBegin(GL_LINES);glVertex3f(-200.0f,0.0f,0.0f);glVertex3f(200.0f,0.0f,0.0f);glVertex3f(0.0f,-200.0f,0.0f);glVertex3f(0.0f,200.0f,0.0f);glVertex3f(0.0f,0.0f,-200.0f);glVertex3f(0.0f,0.0f,200.0f);glEnd();glPushMatrix();glTranslatef(200.0f,0.0f,0.0f);glRotatef(90.0f,0.0f,1.0f,0.0f);glutWireCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,200.0f,0.0f);glRotatef(-90.0f,1.0f,0.0f,0.0f);glutWireCone(3,6,10,10);glPopMatrix();glPushMatrix();glTranslatef(0.0f,0.0f,200.0f);glRotatef(90.0f,0.0f,0.0f,1.0f);glutWireCone(3,6,10,10);glPopMatrix();//开始白色GL_POLYGON_STIPPLE绘制glColor3f(1.0f,1.0f,1.0f);glEnable(GL_POLYGON_STIPPLE);//黑白交替图案绘制第一个矩形glPolygonStipple(stippledata);glRectf(0.0f,0.0f,64.0f,64.0f);//苍蝇图案绘制第二个矩形glPolygonStipple(flydata);glRectf(64.0f,0.0f,128.0f,64.0f);//结束GL_POLYGON_STIPPLE绘制glDisable(GL_POLYGON_STIPPLE);//恢复压入栈的MatrixglPopMatrix();//交换两个缓冲区的指针glutSwapBuffers();
}
//设置Redering State
void setupRederingState(void){//设置清理颜色为黑色glClearColor(0.0f,0.0,0.0,1.0f);//设置绘画颜色为绿色glColor3f(0.0f,1.0f,0.0f);//平面填充glShadeModel(GLU_FLAT);
}
//窗口大小变化回调函数
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);*/glOrtho(0.0f,w,0.0f,h,-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 PloygonStipple 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_STIPPLE示例程序:相关推荐

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

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

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

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

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

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

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

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

  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. U深度利用iso文件制作U盘启动盘
  2. java命令模式返回值_JAVA 设计模式 命令模式
  3. 【微机原理与接口技术】多功能可编程芯片 与 多功能电饭煲
  4. linear在HTML的作用,CSS3里的linear-gradient()函数
  5. GridView的常用操作(增删改查)
  6. 全面掌控你的苹果Mac:iStat Menus
  7. Oracle 区管理和段空间管理小结
  8. 计算机课的十个小游戏制作教程,腾讯内容开放平台
  9. 为什么python胶水语言_为什么只有python成了胶水语言?
  10. windows 系统 system 进程占用80端口
  11. 小刘同学的第五十五篇博文
  12. Python计算细胞核与细胞质的面积比opencv或pil实验
  13. Elasticsearch构建全文搜索系统
  14. BZOJ4484 JSOI2015最小表示(拓扑排序+bitset)
  15. 消防装备管理心得体会
  16. oracle 怎么看监听文件,【学习笔记】Oracle11G关于监听文件位置与监听文件大小限制...
  17. [日推荐]『我的时间线』记录你的生活
  18. Win11商店无法加载页面怎么办 Win11应用商店打不开怎么办
  19. 别再纠结于那些自动化测试不得不面对的现实z
  20. 习题2.7 编写程序,输出0到360中所有度数为5°倍数的角度的正弦值和余弦值

热门文章

  1. 片偏移怎么计算_搞懂钢丝网片计算原理,怎么算都不怕出错!
  2. ai二维码插件_超实用的AI脚本插件合集2.0免费分享,让你的设计快人一步
  3. java 英文数字下划线_为什么Java7开始在数字中使用下划线
  4. python字符串转化为数字信号_用python实现简单的数字信号软件滤波处理
  5. 如何使用mysql建立项目_【dbForge Studio for MySQL入门教程】如何在项目中使用数据库对象和如何使用项目构建配置...
  6. C++判断一个序列是否为堆(最大堆、最小堆)
  7. linux安装运行redis
  8. 『学了就忘系列』Linux基础命令 — 搜索操作相关命令
  9. 家用计算机的辐射,计算机辐射有多大?
  10. 关于DX中纹理平移的一个小问题