【OpenGL修行】点线面模式设置

点的大小切换

通过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chaoql

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值