【OpenGL】 创建窗口

使用 glut

opengl 标准并没有提供用于创建和管理窗口的 api,各个主流操作系统都提供了支持 opengl 的接口,x 系统提供的接口叫做 GLX,windows 提供的接口叫 WGL,mac 系统提供的接口叫做 CGL。我们可以使用 opengl 的一个工具库 glut(opengl utility toolkit)来管理窗口,处理事件,IO 控制和其它设备管理。
首先,我们需要下载 glut 库,下载地址
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
下载之后得到五个文件,glut.h,glut.lib,glut32.lib,glut.dll 和 glut32.dll。接下来就是配置环境变量了,我使用的环境是 windows+visual studio。

  • 第一步,把 glut.h 放在 visual studio 安装目录下的 VC/include/gl 目录中(默认没有 gl 文件夹,自己创建一个)
  • 第二步,把 glut.lib 和 glut32.lib 放在 visual studio 安装目录下的 VC/lib 目录下
  • 第三步,把 glut.dll 和 glut32.dll 放在系统目录 c:\windows\system32 目录下,64 位系统放在 c:\windows\syswow64 目录下

第一个例子

新建一个 C++ 空项目,控制台或 win32 都行,然后添加一个源文件

#include 
#include 

using namespace std;

void renderPreFrame();

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);

    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("First Window");

    glutDisplayFunc(renderPreFrame);

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

    glutMainLoop();

    return 0;
}

void renderPreFrame()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
}

运行之后可以看到一个 400x400 的黑窗口,在距离左上角 (100,100) 的位置。
opengl 库有三类函数,115 个以 gl 开头的函数是 opengl 核心库函数,43个以 glu 开头的函数是 opengl 实用库函数,31 个以 aux 开头的函数是 opengl 辅助库函数。另外在 windows 平台下,有 6 个以 wgl 开头的函数是 windows 专用库函数,还有 5 个无前缀的函数是 win32api 函数。opengl 核心库,实用库和辅助库,windows 操作系统已经配置好了,所以这些函数都可以直接使用。我们下载的工具库函数都是以 glut 开头,平时最常用的函数就是核心库函数(glFun),实用库函数(gluFun)和工具库函数(glutFun)。

  • glutInit 函数用于初始化 glut,其参数可以直接从命令行获取,从命令行启动程序可以带一些有用的参数,比如 -sync 可以关闭 X 异步性质,-gldebug 可以检查 gl 错误并独立地显示它们
  • glutInitDisplayMode 配置 glut 选项,GLUT_DOUBLE 设置双缓冲,即一个缓冲绘制,一个缓冲显示,默认是单缓冲 GLUT_SINGLE;GLUT_RGBA 指定大多数渲染结束位置(比如屏幕)的颜色模式
  • glutInitWindowPosition 指定窗口的位置,glutInitWindowSize 指定窗口大小,glutCreateWindow 用于创建窗口,其参数是窗口的标题
  • glutDisplayFunc 为 opengl 的渲染主回调函数,glut 提供了一些 opengl 与窗口系统交互的函数,glutDisplayFunc 就是其中一个,这个回调函数完成一帧中的所有渲染工作,在 glut 内部循环中不断调用。主回调函数并不会每一帧都绘制,只有窗口发生变化需要重新绘制时才会调用
  • glClearColor 设置清除帧缓冲时所用的颜色,颜色有四个通道 RGBA,取值范围为 0~1 之间。这是一个核心库函数。在这里我们首次接触到 opengl 的状态(state),渲染是一个复杂的过程,不能像普通函数一样接受几个参数就能完成功能,它需要指定 shaders,buffers 和其它各种属性,另外几个渲染操作可能使用同样的属性;因此 opengl 引入了 state,渲染命令只使用跟绘制顶点个数和初始化偏移值有关的个别属性,其它属性根据当前状态设置;修改状态后,它的值会一直维持不变直到下次修改
  • glutMainLoop 将程序控制权交给 glut 并开启其内部循环;在这个循环中,它监听来自窗口系统的事件并通过设置的回调函数传递给 glut,最常见的就是我们设置的渲染主函数;glutMain 只会调用一次,调用之后窗口系统就在这里阻塞,将控制权移交给 glut
  • 在渲染主回调函数中,glClear 使用前面设置的颜色清除帧缓冲;在每次渲染之前,都得先将之前的帧缓冲进行清除
  • 在渲染主回调函数中,glutSwapBuffers 将前置缓冲和后置缓冲进行交换,这是双缓冲模式调用的函数,如果是单缓冲模式则使用 glFlush 函数

至此,一个使用 opengl 的窗口就创建完成了,这里使用了 2 个核心库函数和 8 个工具库函数,添加了一个回调函数,处理每一帧的渲染工作,在这个回调函数里添加一些绘制图元的函数,就可以在窗口中显示图形了,我们下一节就干这件事。

你可能感兴趣的:(OpenGL)