码迷,mamicode.com
首页 > 其他好文 > 详细

OpenGL(三)之基础绘制篇

时间:2015-12-06 12:51:58      阅读:6092      评论:0      收藏:0      [点我收藏+]

标签:

本文将会介绍使用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.三角形

 

画三角形以不同顶点的连接有三种方式,但都是内部填充的方式

 

技术分享

 

  1. GL_TRIANGLES如同GL_LINES一样,第一个三角形的点是V0,V1,V2,第二个则是V3,V4,V5,即是一个3的倍数。不然最后的一个或两个点不显示。
  2. GL_TRIANGLE_STRIP的填充方式犹如放弃前一个顶点,如第一个三角形V0,V1,V2,第二个则是V1,V2,V3(舍弃V0)
  3. GL_TRIANGLE_FAN的填充方式将永远以V0为起始点,如第一个三角形为V0,V1,V2,第二个则是V0,V2,V3

这里就不自己画了,上面的例子已经可以充分表达了

 

2.四边形

 

有两种方式

 

技术分享

 

其区别与画三角形相同,只不过STRIP是隔了2个顶点

 

3.多边形

 

技术分享

 

GL_POLYGON用于画多边形

 

多边形无法绘制非凸多边形,如下图

 

技术分享

 

但可以用glPolygonMode函数改变多边形绘制的模式,绘制其轮廓

 

 

这些以后再详细讨论

OpenGL(三)之基础绘制篇

标签:

原文地址:http://www.cnblogs.com/tjulym/p/5018911.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!