OpenGLut入门01:显示一个基本空白窗口

系列教程索引:OpenGLut入门索引

库链接

一般的编程教程里第一步就是输出hello world。我们也来试一下:

测试代码:

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

using namespace std;

#include <GL/glut.h>
#include <GL/gl.h>

int main(int argc, const char * argv[]) {
cout<<"Hello world!"<<endl;
return 0;
}

输出为:

1
2
$ ./helloworld
Hello world!

代码没有用到OpenGL的任何函数,只是为了测试OpenGL的库是否能够准确找到并链接。

空白窗口

确认库可以正常加载后就可以进行界面的开发了。

flow

如图为OpenGL界面开发的基本流程。那么我们需要init/display/reshape/key处理函数,但是不是全都要,比如说没有键盘控制处理就不需要key函数了。

函数流程为:

function

main函数按照上述流程写,在此之外需要实现显示函数/resize函数/键盘处理函数/初始化函数。

这些回调函数名没有要求,只要参数一样并且函数中包含对应的功能就可以了。

包含头文件

1
2
3
4
5
6
7
#include <iostream>

#include <GL/glut.h>
#include <GL/gl.h>
#include <unistd.h>

using namespace std;

定义键盘按键

1
2
//esc键
#define ESCAPE 27

glut窗口变量

1
int window;//glut窗口标识

main函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, const char * argv[]) {
// 初始化显示模式
glutInit(&argc, const_cast<char **>(argv));
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

// 初始化窗口
glutInitWindowSize(500, 500);//初始界面大小
glutInitWindowPosition(100, 100);//界面初始位置
window=glutCreateWindow(argv[0]);//创建界面,界面标题为argv[0],即程序名称

init();//opengl初始化
glutReshapeFunc(&reshape);
glutDisplayFunc(&display);//回调函数
glutKeyboardFunc(&keyboard);//键盘回调函数

// 开始主循环绘制
glutMainLoop();
return 0;
}

初始化函数

1
2
3
4
void init(){
glClearColor(1.0f,0.0f,1.0f,0.0f);//红绿蓝alpha值
glShadeModel(GL_SMOOTH);//色彩绘制模式
}

窗口大小事件函数

1
2
3
4
5
6
7
8
9
// 窗口大小变化回调函数
void reshape(int w, int h) {
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0, static_cast<GLdouble>(w/h), 0.1, 100000.0);//设置长宽视景
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

绘图函数

1
2
3
4
5
6
7
8
9
10
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(1.0f,1.0f,-6.0f);

glBegin(GL_TRIANGLES);//图像绘制部分
glEnd();

glFlush();//刷新缓冲区
}

键盘函数

1
2
3
4
5
6
7
8
9
//键盘回调函数
void keyboard(unsigned char key,int x,int y){
usleep(100);

if(key == ESCAPE){
glutDestroyWindow(window);//销毁窗口
exit(0);
}
}

测试输出为:

plain

调整init()函数中的:

1
glClearColor(1.0f,0.0f,1.0f,0.0f);//红绿蓝alpha值

就可以调整界面背景色(具体描述见函数说明系列)。

gl开头的是OpenGL的基本函数,glut是控制界面显示的部分。也就是说,可以换成glx(x窗口)、Qt等等。

可以看到我们只在初始化函数中设置了颜色,然后窗口就一直显示这个颜色。OpenGL使用状态机机制,OpenGL会一直保持一种状态知道这种状态被设置为新状态。

完整的函数调用图为

functions

版本

我们来借glut输出OpenGL库版本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <GL/glut.h>
#include <stdio.h>

int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(300, 300);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpenGL Version");

const GLubyte *name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
const GLubyte *flag = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
const GLubyte *OpenGLVersion = glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
const GLubyte *gluVersion = gluGetString(GLU_VERSION); //返回当前GLU工具库版本

printf("OpenGL实现厂商的名字:%s\n", name);
printf("渲染器标识符:%s\n", flag);
printf("OpenGL实现的版本号:%s\n", OpenGLVersion);
printf("OGLU工具库版本:%s\n", gluVersion);
return 0;
}

实体机输出为:

1
2
3
4
OpenGL实现厂商的名字:NVIDIA Corporation
渲染器标识符:GeForce GTX 1660 Ti/PCIe/SSE2
OpenGL实现的版本号:4.6.0 NVIDIA 455.38
OGLU工具库版本:1.3

在虚拟机下面为:

1
2
3
4
OpenGL实现厂商的名字:VMware, Inc.
渲染器标识符:SVGA3D; build: RELEASE; LLVM;
OpenGL实现的版本号:2.1 Mesa 20.0.8
OGLU工具库版本:1.3

只有gl库是不会输出数据的,只有二次开发的库中厂商才会写入这些数据。

OpenGL规定了一系列函数,具体实现由显卡或者其他厂商实现。

OpenGLut代码模板

这个代码只包括基本的窗口显示功能,本系列的后续所有文章附属代码都是在此窗口代码上修改的。

完整源码在OpenGL_Freshman下的OpenGLut的01.window/window.c/version.c中。

下一篇:OpenGL入门02:基本图形


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!