Tutorial 1:
Open a Window
本文源自:http://ogldev.atspace.co.uk/www/tutorial01/tutorial01.html
background
感谢Mariano Suligoy让你可以阅读的这个教程系列的西班牙语版本。
OpenGL规范并没有为创建和操作窗口指定任何的API。该支持OpenGL的现代窗口系统包含了一个可以为OpenGL上下文环境(context)和窗口系统提供联系的子窗口系统。在X Window系统中这个接口称之为GLX。微软为Windows提供了WGL接口(读作:Wiggle)而MacOS则提供了CGL。直接使用这些接口创建一个用于图形显示的窗口通常是很繁重的工作,所以我们使用抽象级别更高库的以避免与这些平台接口相关的细节问题。我们这里使用的库称之为”OpenGL 实用库”简称GLUT。它提供了一些简化的API用以管理窗口以及事件处理、IO控制和其他的一些服务。此外,GLUT是一个跨平台的库,这就保证了较高的可移植性。其他诸如GLUT的库如SDL和GLFW。
Source walkthru
glutInit(&argc, argv);
这个调用用于初始化GLUT。命令行和诸如”-sync”(禁用X windows的异步性),”-gldebug”(自动检查GL的错误并分别显示这些错误)可以作为函数的传入参数。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
这里我们设置一些GLUT的选项。GLUT_DOUBLE启用双缓冲(一个是绘制的后台缓冲区,另一个是显示的前台缓冲)。我们通常会用到这两个选项以及后面会看到的一些选项。
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");
这些调用指定了窗口参数并创建窗口。同时你还可以指定窗口的标题。
glutDisplayFunc(RenderSceneCB);
因为我们在我们工作的窗口系统中,大多数与运行中程序的交互是通过事件回调函数。GLUT考虑到了与底层窗口交互的问题并为我们提供了一些回调的选项。在这里我们仅用到了其中的一个 — 一个用于渲染单个帧”主“回调。而这个回调函数被GLUT的内部循环连续性地调用。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
这是我们第一次接触OpenGL状态的概念。状态背后的思想是这样的,渲染是非常复杂的任务,它不能被简单的作为一个出入一些参数的函数调用(良好设计的函数从不会接收大量的参数)。你需要为之指定着色器、缓冲区和不同的标志,这些将影响渲染会如何发生。此外,你通常想在多个渲染操作中保持一块相同的配置(比如:如果你从未关闭深度测试,那么每一个渲染指令也绝不会有出现这种指定)。这就是为什么大多数的渲染操作的配置中,是通过在OpenGL状态机设置标志和值,而渲染指令也通常限于一些很少的参数包括一定数量的绘制顶点和他们的初始偏移量。在调用状态改变函数后,特定的设置在下次调用同样函数而传入参数不同的时候依然会保持不变。上面的调用会在清除帧缓存(后面会讲述)的时候设置颜色。颜色拥有四个分量(RGBA),这些分量被指定为0.0到1.0之间的标准化取值。
glutMainLoop();
这个调用把控制权交个GLUT的内部循环。在这个循环中,它侦听来自窗口系统的事件并调用我们设置的相关回调函数。而在我们这个例子中GLUT只会调用我们注册的显示回调函(RenderSceneCB)用以渲染帧(frame)。
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
渲染函数所做的唯一一件事情是清除帧缓冲区(使用上边指定的函数-尝试改变它)。第二个调用是告诉GLUT交换前台缓区冲与后台缓冲区所扮演的角色。通过渲染回调函数在下一轮的时候我们将渲染到当前前台缓冲区,此时当前后台缓冲区则会显示。