OpenGL入门程序三:点、线、面的绘制
1、点:
void TestPoint() { //点的大小默认为一个像素,通过下面的函数可以设置一点的大小 glPointSize(50.0f); glBegin(GL_POINTS); glVertex2f(0, 0); glVertex2f(0.5f, 0.5f); glEnd(); }
2、线:
void TestLine() { //设置线的宽度 glLineWidth(500.0f); glBegin(GL_LINES); glVertex2f(0, 0); glVertex2f(0.5f, 0.5f); glEnd(); }
3、虚线:
//画虚线 void TestLineSttiple() { //开启虚线模式 , 使用 glDisable(GL_LINE_STIPPLE) 关闭虚线模式 glEnable(GL_LINE_STIPPLE); //设置线的宽度 glLineWidth(500.0f); //设置虚线的样式 //参数一: 要画的点的个数 //参数二: 是由1和0组成的长度为16的序列,从最低位开始看,如果为1,则直线上接下来应该画的factor个点将被画为实的;如果为0,则直线上接下来应该画的factor个点将被画为虚的。 glLineStipple(2, 0x0F0F); glBegin(GL_LINES); glVertex2f(0, 0); glVertex2f(0.5f, 0.5f); glEnd();
4、多边形:
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,顺时针
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
void TestPolygon() { //glPolygonMode(GL_FRONT, GL_FILL); // 设置正面为填充方式 //glPolygonMode(GL_BACK, GL_LINE); // 设置反面为边缘绘制方式 //glPolygonMode(GL_FRONT_AND_BACK, GL_POINT); // 设置两面均为顶点绘制方式 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(); }
3>剔除多边形:
glEnable(GL_CULL_FACE) 启动剔除功能
glDisable(GL_CULL_FACE) 关闭剔除功能
glCullFace的参数可以是GL_FRONT、GL_BACK、GL_FRONT_AND_BACK,分别表示剔除正面、剔除反面、剔除正反两面的多边形。
注意:剔除功能只影响多边形,而对点和直线无影响。例如,使用glCullFace(GL_FRONT_AND_BACK)后,所有的多边形都将被剔除,所以看见的就只有点和直线。
4>多边形镂空:
glEnable(GL_POLYGON_STIPPLE) 启动镂空模式
glDisable(GL_POLYGON_STIPPLE) 关闭镂空模式
使用 glPolygonStipple(const GLubyte *mask) 来设置镂空的样式,参数mask指向一个长度为128字节的空间,它表示了一个32*32的矩形应该如何镂空。其中:第一个字节表示了最左下方的从左到右(也可以是从右到左,这个可以修改)8个像素是否镂空(1表示不镂空,显示该像素;0表示镂空,显示其后面的颜色),最后一个字节表示了最右上方的8个像素是否镂空。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 // 这是最上面的一行 }; void TestPolygonStipple() { //启动镂空模式 glEnable(GL_POLYGON_STIPPLE); //设置镂空模式 glPolygonStipple(Mask); //在右上角画一个带有镂空效果的矩形 glRectf(0.0f, 0.0f, 0.5f, 0.5f); //关闭镂空效果 glDisable(GL_POLYGON_STIPPLE); //在左下角绘制一个没有镂空效果的矩形 glRectf(-0.5f, -0.5f, 0.0f, 0.0f); }
具体镂空出的是什么样的图形,可以试着用具体绘图工具生成相关 的镂空参数。