本文将会介绍使用OpenGL进行点,线,三角形乃至多边形的绘制,,,
下图是采用不同类型的图形效果
一、点
点”是一切的基础。 OpenGL提供了一系列函数指定一个点。它们都以glVertex开头,后面跟一个数字和1~2个字母。
例如:
glVertex2d
glVertex2f
glVertex3f
glVertex3fv 等等。
数字表示参数的个数:2表示有两个参数,3表示三个,4表示四个。
字母表示参数的类型:
s表示16位整数(OpenGL中将这个类型定义为GLshort),
i表示32位整数(OpenGL中将这个类型定义为GLint和GLsizei),
f 表示32位浮点数(OpenGL中将这个类型定义为GLfloat和GLclampf),
d表示64位浮点数(OpenGL中将这个类型定义为GLdouble和GLclampd)。
v表示传递的几个参数将使用指针的方式,见下面的例子。
这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是等效的:
(一)glVertex2i(1, 3);
(二)glVertex2f(1.0f, 3.0f);
(三)glVertex3f(1.0f, 3.0f, 0.0f);
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f);
(五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
glVertex3fv(VertexArr3);
OpenGL的很多函数都是采用这样的形式。
OpenGL中描述一个面(线、点)的方法是glBegin/glEnd命令组:
glBegin(形状);
glVertex(顶点1);
glVertex(顶点2);
……
glEnd();
void glPointSize(GLfloat size);
size必须大于0.0f,默认值为1.0f,单位为“像素”。
注意:对于具体的OpenGL实现,点的大小都有个限度的,如果设置的size超过最大值,则设置可能会有问题。
下面是一段示例代码:
1 //GLUT的头文件 2 //本来OpenGL程序一般还要包含<GL/gl.h>和<GL/glu.h>,但GLUT的头文件中已经自动将这两个文件包含了,不必再次包含 3 #include <glut.h> 4 5 void myDisplay(void) 6 7 { 8 //表示清除颜色 9 glClear(GL_COLOR_BUFFER_BIT); 10 11 //设置点的大小 12 glPointSize(5.0f); 13 14 glBegin(GL_POINTS); 15 glVertex2f(0.0f, 0.0f); 16 glVertex2f(0.5f, 0.5f); 17 glEnd(); 18 19 //保证前面的OpenGL命令立即执行(而不是让它们在缓冲区中等待) 20 glFlush(); 21 22 } 23 24 //带命令行参数的main函数 25 int main(int argc, char *argv[]) 26 27 { 28 glutInit(&argc, argv); 29 30 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 31 32 glutInitWindowPosition(100, 100); 33 34 glutInitWindowSize(400, 400); 35 36 glutCreateWindow("OpenGL画点程序"); 37 38 glutDisplayFunc(&myDisplay); 39 40 glutMainLoop(); 41 42 return 0; 43 44 }
效果如图
二、线
直线可以指定宽度
void glLineWidth(GLfloat width);
其用法跟glPointSize类似。
与OpenGL画点函数十分类似,不同在于glBegin()中的符号常量。
使用图元常量GL_LINES可连接每一对相邻定点而得到一组直线段。
1 glBegin(GL_LINES); 2 glVertex2iv (p1); 3 glVertex2iv (p2); 4 glVertex2iv (p3); 5 glVertex2iv (p4); 6 glVertex2iv (p5); 7 glEnd();
上述代码可以画出线段p1-p2和p3-p4。
示例:
使用GL_LINE_STRIP则可以获得折线,如果需要封闭的折线则需要重复某些点坐标。
1 glBegin(GL_LINE_STRIP); 2 glVertex2iv (p1); 3 glVertex2iv (p2); 4 glVertex2iv (p3); 5 glVertex2iv (p4); 6 glVertex2iv (p5); 7 glEnd();
上述代码画出折线p1-p2-p3-p4-p5。
示例:
生成封闭折线的常量是GL_LINE_LOOP。
1 glBegin(GL_LINE_LOOP); 2 glVertex2iv (p1); 3 glVertex2iv (p2); 4 glVertex2iv (p3); 5 glVertex2iv (p4); 6 glVertex2iv (p5); 7 glEnd();
上述代码画出封闭折线p1-p2-p3-p4-p5-p1。
- 示例代码
1 #include <GL/glut.h> 2 3 void init(){ 4 glClearColor (0.0, 0.0, 0.0, 0.0); 5 glMatrixMode (GL_PROJECTION); 6 gluOrtho2D (0.0, 200.0, 0.0, 150.0); 7 } 8 9 void display(){ 10 int p1 [] = {110, 50}; 11 int p2 [] = {20, 0}; 12 int p3 [] = {55, 80}; 13 int p4 [] = {90, 0}; 14 int p5 [] = {0, 50}; 15 16 glClear (GL_COLOR_BUFFER_BIT); 17 18 19 glBegin(GL_LINE_LOOP); 20 glVertex2iv(p1); 21 glVertex2iv(p2); 22 glVertex2iv(p3); 23 glVertex2iv(p4); 24 glVertex2iv(p5); 25 glEnd(); 26 27 glFlush(); 28 } 29 30 void main(int argc, char *argv[]) 31 { 32 glutInit(&argc, argv); 33 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 34 glutInitWindowSize(400, 300); 35 glutCreateWindow("Five-Pointed Star"); 36 init(); 37 glutDisplayFunc(display); 38 glutMainLoop(); 39 }
运行结果如下:
大家可自行比较三张截图了解不同。
三、几何物体
1.三角形
画三角形以不同顶点的连接有三种方式,但都是内部填充的方式
- GL_TRIANGLES如同GL_LINES一样,第一个三角形的点是V0,V1,V2,第二个则是V3,V4,V5,即是一个3的倍数。不然最后的一个或两个点不显示。
- GL_TRIANGLE_STRIP的填充方式犹如放弃前一个顶点,如第一个三角形V0,V1,V2,第二个则是V1,V2,V3(舍弃V0)
- GL_TRIANGLE_FAN的填充方式将永远以V0为起始点,如第一个三角形为V0,V1,V2,第二个则是V0,V2,V3
这里就不自己画了,上面的例子已经可以充分表达了
2.四边形
有两种方式
其区别与画三角形相同,只不过STRIP是隔了2个顶点
3.多边形
GL_POLYGON用于画多边形
多边形无法绘制非凸多边形,如下图
但可以用glPolygonMode函数改变多边形绘制的模式,绘制其轮廓
这些以后再详细讨论