源码:https://github.com/triplepointfive/ogldev
http://ogldev.atspace.co.uk/www/tutorial01/tutorial01.html
背景知识
OpengGL说明书并没有定义API以供创建或者操作窗口。现代支持OpengGL的窗口系统包含了一个子系统,它能够在OpenGL上下文和窗口系统之间做一个连接。在X 窗口系统中提供了称之为GLX的接口。微软提供了WGL,而MacOS有自己的CGL。直接使用这些接口工作只是为了创建一个用来展示图形的窗口是很麻烦的工作,这也就是我们为什么使用高级的库的原因,这些高级的库抽象了很多,屏蔽了很多的细节。我们这里的使用的库是GLUT——OpenGL utility library。它提供了简化的API,能很方便的管理窗口、事件的处理、IO控制以及其他的服务。除此之外,GLUT是一格跨平台的库,移植起来很方便。同样我们可以使用SDL或者GLFW库。
代码注释
glutInit(&argc, argv);
这个是GLUT初始化。这个参数可以直接从命令行传入,还包含了一些有用的选择比如-sync和-gldebug,-sync用以将x的异步关闭,-gldebug用以控制自动检测GL的错误并显示出来。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
上面的代码对GLUT做了些配置。GLUT_DOUBLE 打开了双缓冲(一个用于背后绘制,一个用于前面的显示),GLUT_RGBA是最常用的屏幕显示设置。我们后面还会介绍更多的配置。
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");
这个几行代码定义了窗口的参数,并且创建了一个窗口。你可以设置窗口的标题。
glutDisplayFunc(RenderSceneCB);
由于我们是工作在窗口系统中,大多数与运行的程序的交互都是通过事件的回调触发的。GLUT也考虑到了和底层的窗口系统的交互,它为我们提供了一系列的回调选择。这里我们仅仅使用一个main回调,它用于绘制所有的帧。这个函数通常叫做GLUT的内部循环。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
上面的代码,使我们第一次遇到OpenGL中状态的概念。状态背后的真正意义是渲染是一个很复杂的任务。它不能当做一个能够接受一些参数函数的简单调用,事实上正确设计的函数从来不会接受过多的参数。你需要定义shaders,buffers还有很多标记,这些标记影响渲染到底如何发生。除此之外,你可能想在几个渲染操作之后依然保留些配置。比如,你从来不会关闭深度检测,这个如果在每帧都去设置一次是没有意义的。这就是为什么很多的渲染指令都是通过设置OpenGL的状态机的标记和一些值的原因。渲染指令本身通常限制在很少的参数内,然后再给个顶点的重复绘制。当调用切换状态的函数之后,特定的配置被保留知道下一次设置不同的值。上面的设置颜色的调用会在清楚帧缓存的时候被使用,这个后面会介绍。颜色又四个通道RGBA,它被定义在0~1之间。
glutMainLoop();
这个是GLUT的内部循环。这个循环中,它监听了窗口系统的事件,然后给派发给我们注册的回调函数处理。在我们的例子中,GLUT将只会调用我们注册的显示回调函数(RenderSceneCB),它用来绘制每帧。
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
我们在渲染函数的做的唯一的事情就是使用上面指定的颜色清除缓存。第二个调用是告知GLUT去交换backbuffer和frontbuffer。下一次的循环中我们将会把backbuffer作为当前缓存显示出来,然后frontbuffer作为后面绘制的缓存。
注:GLUT——OpenGL Utility Toolkit。
接下来是关于配置的操作。
1/下载freeglut源码
https://sourceforge.net/projects/freeglut/files/latest/download
2/下载cmake工具
https://cmake.org/download/
3/安装cmake工具,然后编译
编译设置:
在安装好cmake工具之后,运行它,然后选择源码的路劲,以及要编译输出的路径,然后点击configure按钮,选择2017版本,在配置完成后,点击Generate即可。
生成之后,用vs2017打开,编译即可。
4/用vs2017打开项目的.sln文件,然后进行编译freeglut项目。
5/把freeglut下的include文件夹下的文件拷贝到vs的include目录下。
6.把freeglut下的freeglutd.lib拷贝到C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib
没有lib文件下新建
7.把freeglut下的freeglutd.dll拷贝到C:\Windows\SysWOW64
注意这里是64位的机器,要拷贝这个位置。如果是32位的,则要拷贝到C:\Windows\System32
补充:由于后面的图片读取、已经assimp加载模型都是使用的是release版本的,所以我们这里还需要编译一个release版本的dll。
8.新建项目,然后设置好依赖库
9.编写测试程序:
// GLUT.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <freeglut.h>
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
glFlush();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(100, 100);
glutInitWindowSize(400, 400);
glutCreateWindow("第一个OpenGL程序");
glutDisplayFunc(&myDisplay);
glutMainLoop();
return 0;
}
运行结果:
over!