点与线
常用方法
glBegin与glEnd
OpenGL的图元绘制放在函数glBegin和glEnd之间,由函数glBegin的参数指定绘制图元的类型。
结构类似于:
glBegin(XXXXXX);xxxxxxxxxxxxxxglEnd();
其中,glBegin后可填参数,来确定要绘制的图元类型
模式 | 图元类型 |
---|---|
GL_POINTS | 将指定的各个顶点用于创建单个的点 |
GL_LINES | 将指定的项点用于创建线段。每两个顶点指定一条单独的线段。如果项点个数是奇数,则忽略后一个 |
GL_LINE_STRIP | 将指定的顶点用于创建线条。第一个顶点之后的每个顶点指定的是线条延伸到的下一个点 |
GL_LINE_LOOP | 特性和GL_LINE_STRIP相似,只不过最后一条线段是在指定的后一个和第一个顶点之间绘制。典型情况下,这用于绘制那些可能违反了GL_POLYGON用法规则的封闭区域 |
GL_TRIANGLES | 将指定的顶点用于构造三角形。每三个顶点指定一个新三角形。如果顶点个数不是三的倍数,多余的顶点将被忽略 |
GL_TRIANGLE_ | 将指定的顶点用于创建三角条。指定前三个顶点之后,后继的每 |
STRIP | 个顶点与它前面两个顶点一起用来构造下一个三角形。每个顶点三元组(在初的组之后)会自动重新排列以确保三角形绕法的一致性。 |
GL_TRIANGLE_ | 将指定的顶点用于构造三角扇形。第一个顶点充当原点,第三个 |
FAN | 顶点之后的每个顶点与它的前一个顶点还有原点一起组合。 |
GL_QUADS | 每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍数,多余的顶点将被忽略 |
GL_QUADS_sT | 将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点 |
RIP | 定义一个四边形。和GL_QUADS的顶点顺序不一样,每对顶点以指定顺序的逆序使用,以便保证绕法的一致 |
GL_POLYGON | 将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交。最后一个顶点会白动连接到第一个顶点以确保多边形是封闭的 |
点的绘制
glvertex函数用于指定顶点,可以有2,3,4个参数。
例如
glVertex2f(x,y)
glVertex3f(x,y,z)
glVertex4f(x,y,z,w)
两个参数即为平面,三个参数带一个空间向量,四个参数中的w为缩放因子
实际应用
glBegin(GL_POINTS);glVertex3f(0.0f, 0.0f, 0.0f);glVertex3f(0.7f,0.0f,0.0f);
glEnd():
坐标是相对于屏幕中心的,以视窗的宽高分别为正负1,则正中心为0.0点
#define GLUT_DISABLE_ATEXIT_HACK
#include <Windows.h>
#include <gl/glut.h>void yh()
{glClearColor(0.4, 0.2, 0.9, 0.0); glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_POINTS);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(0.7f,0.1f,0.0f);glEnd();glFlush();
}void redraw(int x, int y)
{int dis = x > y ? y : x;glViewport(0, 0, dis, dis);
}int main(int argc, char* argv[])
{glutInit(&argc, argv); glutInitDisplayMode(GLUT_STENCIL|GLUT_RGB); glutInitWindowPosition(0, 0);glutInitWindowSize(500, 500);glutCreateWindow("有视口的窗口");glutDisplayFunc(yh); glutReshapeFunc(redraw);glutMainLoop();return 0;
}
运行结果
在OpenGL中绘制一个点时,点大小的默认值是一个象素。可以用函数glPointSize修改这个值:
void glPointSize(GLfloat size);
这个函数采用一个参数来指定画点时以象素为单位的近似直径。
glPointSize(10);
glBegin(GL_POINTS);
glVertex3f(0.0f,0.0f,0.0f);
glVertex3f(0.7f,0.1f,0.0f);
glEnd();
运行结果
直线的绘制
画线与画点一样,在glBegin后填划线参数,主要的直线绘制模式有三种:
参数 | 作用 |
---|---|
GL LINES | 将顶点1与顶点2相连,3与4相连,不够凑成一对的,则不连 |
GL_LINE_STRIP | 将顶点1与2相连,2与3相连,以此类推 |
GL_LINE_LOOP | 将顶点1与2相连,2与3相连,以此类推,最后将最后一个点与1相连 |
示例
GL_LINES
glBegin(GL_LINES);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(0.7f,0.1f,0.0f);glEnd();
GL_LINE_STRIP
glBegin(GL_LINES);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(0.7f,0.1f,0.0f);glVertex3f(0.2f,0.3f,0.0f);glVertex3f(0.9f,-0.4f,0.0f);glVertex3f(0.3f,0.8f,0.0f);glEnd();
GL_LINE_LOOP
glBegin(GL_LINE_LOOP);glVertex3f(0.0f,0.0f,0.0f);glVertex3f(0.7f,0.1f,0.0f);glVertex3f(0.2f,0.3f,0.0f);glVertex3f(0.9f,-0.4f,0.0f);glVertex3f(0.3f,0.8f,0.0f);glEnd();
直线的类型
直线具有两个类型:线宽与线型
线宽
可用glLineWidth指定线宽:
void glLineWidth(GLfloat width)与点的大小类似,glLineWidth函数采用一个参数来指定要画的线以象素计的近似宽度。
线型
可以用虚线或短划线模式创建直线,需要先调用:glEnable(GL_LINE_STIPPLE);
然后,建立用于画线的模式:
glLineStipple(GLint factor,GLushort pattern);
参数pattern是一个16位值,指定画线时所用的模式,逆向使用。每一位代表线段的一部分是开还是关。默认情况下,每一位对应一个象素。
参数factor充当倍数可以增加模式的宽度。
示例
添加glLineWidth(5)后
添加 glEnable(GL_LINE_STIPPLE); glLineStipple(0,12);