文章目录
- 点
- 点的大小切换
- 线
- 线的宽窄设置
- 虚线绘制
- 多边形
- 多边形正反绘制&反转
- 多边形表面剔除
- 多边形表面镂空
- 通过初始化数组设置镂空样式
- 通过读取bmp文件设置镂空样式
点
点的大小切换
通过glPointSize()函数即可实现点的大小控制,我画了两个大小不同的点,还是挺明显的。
void display1() {//点的大小切换
glPointSize(5.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
glVertex2f(0.5f, 0.5f);
glEnd();
glPointSize(3.0f);
glBegin(GL_POINTS);
glVertex2f(0.3f, 0.3f);
glEnd();
glFlush();
}
线
线的宽窄设置
线的宽窄可以通过glLineWidth()函数来进行控制,大家可以通过下面两条线来进行对比。
void display2() {//线的宽窄切换
glLineWidth(5.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINES);
glVertex2f(0.5f, 0.0f);
glVertex2f(0.0f, 0.8f);
glEnd();
glLineWidth(1.0f);
glBegin(GL_LINES);
glVertex2f(0.65f, 0.0f);
glVertex2f(0.1f, 0.9f);
glEnd();
glFlush();
}
虚线绘制
虚线绘制的时候就需要使用glEnable()来进行虚线模式的开启。
void display3() {//虚线绘制
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_LINE_STIPPLE);//启动虚线模式
glLineStipple(2, 0x0f0f);//pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。
glBegin(GL_LINES);
glVertex2f(0.5f, 0.0f);
glVertex2f(0.0f, 0.8f);
glEnd();
glDisable(GL_LINE_STIPPLE);//关闭虚线模式
glBegin(GL_LINES);
glVertex2f(0.65f, 0.0f);
glVertex2f(0.1f, 0.9f);
glEnd();
glFlush();
}
多边形
多边形正反绘制&反转
一个多边形你可以想象成一个纸片,有正面也有反面,你可以设置他的正反面以及相对应的绘制模式。
glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW); // 设置CW方向为“正面”,CW即ClockWise,顺时针
void display4(void){//反转
glClear(GL_COLOR_BUFFER_BIT);
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为线形模式
glFrontFace(GL_CCW); // 设置逆时针方向为正面
glBegin(GL_POLYGON); // 按逆时针绘制一个正方形,在左下方
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.0f, -0.5f);
glVertex2f(0.0f, 0.0f);
glVertex2f(-0.5f, 0.0f);
glEnd();
glBegin(GL_POLYGON); // 按顺时针绘制一个正方形,在右上方
glVertex2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(0.5f, 0.0f);
glEnd();
glFlush();
}
多边形表面剔除
有的时候你只需要正面或反面,这时候就可以用到表面剔除。
void display5(void) {//表面剔除
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_CULL_FACE);//开启剔除模式
glCullFace(GL_FRONT);//剔除正面
glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充模式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为线形模式
glFrontFace(GL_CCW); // 设置逆时针方向为正面
glBegin(GL_POLYGON); // 按逆时针绘制一个正方形,在左下方
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.0f, -0.5f);
glVertex2f(0.0f, 0.0f);
glVertex2f(-0.5f, 0.0f);
glEnd();
glBegin(GL_POLYGON); // 按顺时针绘制一个正方形,在右上方
glVertex2f(0.0f, 0.0f);
glVertex2f(0.0f, 0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(0.5f, 0.0f);
glEnd();
glFlush();
}
多边形表面镂空
通过初始化数组设置镂空样式
直线可以被画成虚线,而多边形则可以进行镂空。
首先,使用glEnable(GL_POLYGON_STIPPLE);来启动镂空模式(使用glDisable(GL_POLYGON_STIPPLE)可以关闭之)。
然后,使用glPolygonStipple来设置镂空的样式。
void glPolygonStipple(const GLubyte *mask);
其中的参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。
void display7(void) {
static GLubyte Mask[128] =
{
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, 0x3F, 0xFC, 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 // 这是最上面的一行
};
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POLYGON_STIPPLE);//开启镂空模式
glPolygonStipple(Mask); //设置镂空样式
glRectf(-0.5f, -0.5f, 0.0f, 0.0f); // 在左下方绘制一个有镂空效果的正方形
glDisable(GL_POLYGON_STIPPLE);//关闭镂空模式
glRectf(0.0f, 0.0f, 0.5f, 0.5f); // 在右上方绘制一个无镂空效果的正方形
glFlush();
}
通过读取bmp文件设置镂空样式
用Windows自带的画笔程序新建一副图片,取名为mask.bmp,注意保存为“单色位图”,设置图片的高度和宽度均为32像素。
void display6(void){
static GLubyte Mask[128];
FILE* fp;
fp = fopen("C:/Users/123/Desktop/mask.bmp", "rb"); //黑色表示镂空
if (!fp) //未读取到文件
exit(0);
// 移动文件指针到这个位置,使得再读sizeof(Mask)个字节就会遇到文件结束
// 如果直接写-sizeof(Mask)的话,因为sizeof取得的是一个无符号数,取负号会有问题
if (fseek(fp, -(int)sizeof(Mask), SEEK_END))
exit(0);
// 读取sizeof(Mask)个字节到Mask
if (!fread(Mask, sizeof(Mask), 1, fp))
exit(0);
fclose(fp);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_POLYGON_STIPPLE);//开启镂空模式
glPolygonStipple(Mask); //设置镂空样式
glRectf(-0.5f, -0.5f, 0.0f, 0.0f); // 在左下方绘制一个有镂空效果的正方形
glDisable(GL_POLYGON_STIPPLE);//关闭镂空模式
glRectf(0.0f, 0.0f, 0.5f, 0.5f); // 在右上方绘制一个无镂空效果的正方形
glFlush();
}
参考文献:
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html