系列教程索引: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的库是否能够准确找到并链接。
空白窗口
确认库可以正常加载后就可以进行界面的开发了。

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

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;
|
定义键盘按键
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]);
init(); glutReshapeFunc(&reshape); glutDisplayFunc(&display); glutKeyboardFunc(&keyboard);
glutMainLoop(); return 0; }
|
初始化函数
1 2 3 4
| void init(){ glClearColor(1.0f,0.0f,1.0f,0.0f); 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); } }
|
测试输出为:

调整init()函数中的:
1
| glClearColor(1.0f,0.0f,1.0f,0.0f);
|
就可以调整界面背景色(具体描述见函数说明系列)。
gl开头的是OpenGL的基本函数,glut是控制界面显示的部分。也就是说,可以换成glx(x窗口)、Qt等等。
可以看到我们只在初始化函数中设置了颜色,然后窗口就一直显示这个颜色。OpenGL使用状态机机制,OpenGL会一直保持一种状态知道这种状态被设置为新状态。
完整的函数调用图为

版本
我们来借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); const GLubyte *flag = glGetString(GL_RENDERER); const GLubyte *OpenGLVersion = glGetString(GL_VERSION); const GLubyte *gluVersion = gluGetString(GLU_VERSION);
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中。
下一篇:OpenGLut开发入门教程02:基本图形