我是靠谱客的博主 生动秋天,这篇文章主要介绍OPENGL学习(三)GLUT二维图像绘制,现在分享给大家,希望可以做个参考。

文章目录

      • 1.Opengl的Hello world
      • 2.初始化(调整试图)
      • 3.增加Reshape函数
      • 3.事件
      • 4.动画

1.Opengl的Hello world

最基础的程序,画了个三角形,请确保理解这个程序,核心是opengl是一个状态机。想象opengl是一个几何画板,glBegin(GL_TRIANGLES);就是点击绘制三角。glColor3f(1.0, 0.0, 0.0);就是将颜色设置为红色。然后你在三个不同位置点了三个点。glFlush();就是保存提交给画面。然后你就得到了结果。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <gl/glut.h> //当窗口发生变化(如改变大小)时自动调用 void mydisplay() { //清除颜色缓存 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); //二维也可以用glVertex2f //第一点红色 glColor3f(1.0, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); //第二点绿色 glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 1.0, 0.0); //第三点蓝色 glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glEnd(); glFlush(); } int main(int argc, char** argv) { glutInit(&argc, argv); //初始化窗口名称 glutCreateWindow("A Triangle"); //绑定display函数 glutDisplayFunc(mydisplay); //开启窗口循环 glutMainLoop(); return 0; }

在这里插入图片描述

2.初始化(调整试图)

手动设置了使用RGB绘制、窗口位置及窗口大小。并且在init函数中加入了glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);将图像变成了图中(x,y,z)分别对应范围(0-1,0-1,0-1)区间。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <gl/glut.h> //当窗口发生变化(如改变大小)时自动调用 void mydisplay() { //清除颜色缓存 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); //二维也可以用glVertex2f //第一点红色 glColor3f(1.0, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); //第二点绿色 glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 1.0, 0.0); //第三点蓝色 glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glEnd(); glFlush(); } void init() { //全屏颜色变成黑色 glClearColor(0.0, 0.0, 0.0, 1.0); //改变投影视图, glMatrixMode(GL_PROJECTION); //opengl是一个状态机,要先清空之前的变换矩阵数据,所以每次视角操作时都要先变为单位矩阵 glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); } int main(int argc, char** argv) { glutInit(&argc, argv); //GLUT_RGB指使用RGB进行绘制 glutInitDisplayMode(GLUT_RGB); //初始化窗口大小 glutInitWindowSize(100, 100); //初始化窗口位置 glutInitWindowPosition(100, 100); //设置窗口名 glutCreateWindow("A Triangle"); //绑定display函数 glutDisplayFunc(mydisplay); //设定opengl初始状态 init(); //开启窗口循环 glutMainLoop(); return 0; }

在这里插入图片描述

3.增加Reshape函数

在改变窗口时会调用的函数。默认的reshape函数会直接拉伸图形。
在这里插入图片描述
我们希望图像不被拉伸,而是保持原有大小。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <gl/glut.h> //窗口初始大小 int initW = 300; int initH = 300; //当窗口发生变化(如改变大小)时自动调用 void mydisplay() { //清除颜色缓存 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); //二维也可以用glVertex2f //第一点红色 glColor3f(1.0, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); //第二点绿色 glColor3f(0.0, 1.0, 0.0); glVertex3f(0.0, 1.0, 0.0); //第三点蓝色 glColor3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, 0.0); glEnd(); glFlush(); } //初始化函数,一般包括视角等 void init() { //全屏颜色变成黑色 glClearColor(0.0, 0.0, 0.0, 1.0); //改变投影视图, glMatrixMode(GL_PROJECTION); //opengl是一个状态机,要先清空之前的变换矩阵数据 glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); } //当改变窗口大小时调用的数据 void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(0, 1.0, 0.0, (GLfloat)h / (GLfloat)w * 1.0, 0.0, 1.0); else glOrtho(0, (GLfloat)w / (GLfloat)h * 1.0, 0.0, 1.0, 0.0, 1.0); } int main(int argc, char** argv) { glutInit(&argc, argv); //GLUT_RGB指使用RGB进行绘制 glutInitDisplayMode( GLUT_RGB); //初始化窗口大小 glutInitWindowSize(initW, initH); //初始化窗口位置 glutInitWindowPosition(100, 100); //设置窗口名 glutCreateWindow("A Triangle"); //绑定display函数 glutDisplayFunc(mydisplay); //设定opengl初始状态 init(); //绑定改变窗口大小时调用的函数 glutReshapeFunc(myReshape); //开启窗口循环 glutMainLoop(); return 0; }

在这里插入图片描述

3.事件

增加了鼠标左键点击事件mouse,点击时会改变图像亮度并输出点击位置

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <gl/glut.h> #include <iostream> //窗口初始大小 int initW = 300; int initH = 300; //颜色亮度 GLfloat brightness = 1.0; GLfloat increment = -0.1; //当窗口发生变化(如改变大小)时自动调用 void mydisplay() { //清除颜色缓存 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); //二维也可以用glVertex2f //第一点红色 glColor3f(brightness, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); //第二点绿色 glColor3f(0.0, brightness, 0.0); glVertex3f(0.0, 1.0, 0.0); //第三点蓝色 glColor3f(0.0, 0.0, brightness); glVertex3f(0.0, 0.0, 0.0); glEnd(); glFlush(); } //初始化函数,一般包括视角等 void init() { //全屏颜色变成黑色 glClearColor(0.0, 0.0, 0.0, 1.0); //改变投影视图, glMatrixMode(GL_PROJECTION); //opengl是一个状态机,要先清空之前的变换矩阵数据 glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); } //当改变窗口大小时调用的数据 void myReshape(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if (w <= h) glOrtho(0, 1.0, 0.0, (GLfloat)h / (GLfloat)w * 1.0, 0.0, 1.0); else glOrtho(0, (GLfloat)w / (GLfloat)h * 1.0, 0.0, 1.0, 0.0, 1.0); } //鼠标事件 void mouse(int btn, int state, int x, int y) { //左击鼠标,调整图像亮度 if (btn == GLUT_LEFT_BUTTON && state == GLUT_DOWN) { //输出位置,注意鼠标原点在左上角,图像原点在右下角,所以y是反的 std::cout << "x: " << x << " y: " << y << std::endl; //改变亮度 brightness += increment; if (brightness >= 1.0 || brightness <= 0.0) increment = -increment; } } int main(int argc, char** argv) { glutInit(&argc, argv); //GLUT_RGB指使用RGB进行绘制 glutInitDisplayMode( GLUT_RGB); //初始化窗口大小 glutInitWindowSize(initW, initH); //初始化窗口位置 glutInitWindowPosition(100, 100); //设置窗口名 glutCreateWindow("A Triangle"); //绑定display函数 glutDisplayFunc(mydisplay); //设定opengl初始状态 init(); //绑定改变窗口大小时调用的函数 glutReshapeFunc(myReshape); //绑定鼠标事件 glutMouseFunc(mouse); //开启窗口循环 glutMainLoop(); return 0; }

在这里插入图片描述

4.动画

使用定时器的一段动画,图像亮度随时间变化

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <gl/glut.h> #include <iostream> //窗口初始大小 int initW = 300; int initH = 300; //颜色亮度 GLfloat brightness = 1.0; GLfloat increment = -0.1; //当窗口发生变化(如改变大小)时自动调用 void mydisplay() { //清除颜色缓存 glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); //二维也可以用glVertex2f //第一点红色 glColor3f(brightness, 0.0, 0.0); glVertex3f(1.0, 0.0, 0.0); //第二点绿色 glColor3f(0.0, brightness, 0.0); glVertex3f(0.0, 1.0, 0.0); //第三点蓝色 glColor3f(0.0, 0.0, brightness); glVertex3f(0.0, 0.0, 0.0); glEnd(); //使用DOUBLE_BUFFER后,使用以下代码来交换前后台内存 glutSwapBuffers(); } //定时器调用的函数 void changeColor(int x) { //改变亮度 brightness += increment; if (brightness >= 1.0 || brightness <= 0.0) increment = -increment; //立刻重新调用display函数,不然图像不会被立刻绘制 glutPostRedisplay(); //设置新的定时器 glutTimerFunc(100, changeColor, 0); } //初始化函数,一般包括视角等 void init() { //全屏颜色变成黑色 glClearColor(0.0, 0.0, 0.0, 1.0); //改变投影视图, glMatrixMode(GL_PROJECTION); //opengl是一个状态机,要先清空之前的变换矩阵数据 glLoadIdentity(); glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0); } int main(int argc, char** argv) { glutInit(&argc, argv); //GLUT_DOUBLE双缓存,通常应用于动画中,可以使动画更顺滑 //GLUT_RGB指使用RGB进行绘制 glutInitDisplayMode( GLUT_RGB|GLUT_DOUBLE); //初始化窗口大小 glutInitWindowSize(initW, initH); //初始化窗口位置 glutInitWindowPosition(100, 100); //设置窗口名 glutCreateWindow("A Triangle"); //设置定时函数 glutTimerFunc(10, changeColor, 0); //绑定display函数 glutDisplayFunc(mydisplay); //设定opengl初始状态 init(); //开启窗口循环 glutMainLoop(); return 0; }

最后

以上就是生动秋天最近收集整理的关于OPENGL学习(三)GLUT二维图像绘制的全部内容,更多相关OPENGL学习(三)GLUT二维图像绘制内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部