OpenGL实战教程(4) -- 第三站:深入理解点、线、多边形的绘制(VS2015)

1、点

点的大小默认为1个像素,但也可以用glPointSize修改大小。
其函数原型如下:
void glPointSize(GLfloat size); size必须大于0.0f,默认值为1.0f,单位为“像素”。

glPointSize(5.0f);
glBegin(GL_POINTS);
glVertex2f(0.0f, 0.0f);
glVertex2f(0.5f, 0.5f);
glEnd();

2、直线

(1)直线宽度:
void glLineWidth(GLfloat width);
(2)画虚线。
首先,使用glEnable(GL_LINE_STIPPLE)来启动虚线模式
用glDisable(GL_LINE_STIPPLE)关闭虚线模式。
然后,使用glLineStipple来设置虚线的样式。
void glLineStipple(GLint factor, GLushort pattern);
pattern是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。

glEnable(GL_LINE_STIPPLE); 
glLineStipple(2, 0x0F0F); 
glLineWidth(10.0f); 
glBegin(GL_LINES); 
	glVertex2f(0.0f, 0.0f); 
	glVertex2f(0.5f, 0.5f); 
glEnd();

3、多边形

(1)多边形的两面以及绘制方式。
从三维的角度来看,一个多边形具有两个面。每一个面都可以设置不同的绘制方式:填充、只绘制边缘轮廓线、只绘制顶点,其中“填充”是默认的方式。可以为两个面分别设置不同的方式。 glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充方式
glPolygonMode(GL_BACK, GL_LINE); // 设置反面为边缘绘制方式
glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式

(2)正反面的反转
一般约定为“顶点以逆时针顺序出现在屏幕上的面”为“正面”,另一个面即成为“反面”。生活中常见的物体表面,通常都可以用这样的“正面”和“反面”,“合理的”被表现出来。 但也有一些表面比较特殊。例如“麦比乌斯带”,可以全部使用“正面”或全部使用“背面”来表示。 可以通过glFrontFace函数来交换“正面”和“反面”的概念。
glFrontFace(GL_CCW); // 设置CCW方向为“正面”,CCW即CounterClockWise,逆时针
glFrontFace(GL_CW); // 设置CW方向为“正面”,CW即ClockWise,顺时针

(3)剔除多边形表面
在三维空间中,一个多边形虽然有两个面,无法看见背面的那些多边形,而一些多边形虽然是正面的,但被其他多边形所遮挡。如果将无法看见的多边形和可见的多边形同等对待,无疑会降低我们处理图形的效率。
在这种时候,可以将不必要的面剔除。 首先,用glEnable(GL_CULL_FACE); 来启动剔除功能;glDisable(GL_CULL_FACE)关闭剔除功能。
然后,使用glCullFace来进行剔除。
glCullFace的参数可以是GL_FRONT,GL_BACK或者GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。
注意:剔除功能只影响多边形,而对点和直线无影响。
例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。

(4)镂空多边形

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

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

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

3、源代码

void Step3_DrawDot_Line_Polygon(void)
{
	glClear(GL_COLOR_BUFFER_BIT); 

	glPointSize(5.0f);  // 设点大小
	glBegin(GL_POINTS); 
		glVertex2f(-0.8f, -0.8f);
		glVertex2f(-0.8f, 0.8f);
	glEnd();
		
	glEnable(GL_LINE_STIPPLE);	// 启动虚线模式
	glLineStipple(1, 0x0F0F);	// 设线模式
	glLineWidth(10.0f);			// 设线宽
	glBegin(GL_LINES); 
		glVertex2f(0.0f, 0.0f); 
		glVertex2f(0.5f, 0.5f); 
	glEnd();
	glDisable(GL_LINE_STIPPLE);//关闭虚线模式

	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(); 
}

运行效果:

在这里插入图片描述

4、工程源代码下载

在debug-x86下编译通过。

在这里插入图片描述

第三站源码下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值