opengl教程翻译 #1创建一个窗口
OpenGl规范没有为创建和操作视窗指定任何的API。目前流行的支持OpenGL的视窗系统,一般包含支持其的子
系统,提供OpenGL上下文和视窗系统之间的绑定。在X视窗系统中,这样的接口被称为GLX。微软为视窗提供
WGL,MacOS则有CGL。用这些接口无误地创建一个显示图形的视窗通常是一项繁琐的工作,这就是为什么我们
需要一个高水平的库来把这些细节抽象出来。我们把这个库叫做“OpenGL程序集库”,简称GLUT。它提供了一
个简易的API,对视窗管理以及事件处理、IO控制和一些其他服务。另外,GLUT是跨平台的,移植更容易。代
替GLUT的备选方案包含SDL和GLFW。
glutInit(&argc, argv);
这句用来初始化GLUT。参数可以从命令行传入,包括一些有用的选项例如"-sync"和"-gldebug",可以禁用X
视窗的异步特征,以及分别自动的检测和显示GL错误。
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
这里我们配置一些GLUT的选项。GLUT_DOUBLE 意味着能够双缓存(一面在后台缓存绘制,另一名缓存负责显
示),和颜色缓存(大多数渲染结束的地方,例如屏幕)。我们通常希望用到这2个及其他选项。
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");
这些调用指定参数并创建视窗。你也可以指定视窗标题。
glutDisplayFunc(RenderSceneCB);
由于我们工作环境在视窗系统,大部分与运行程序的交互都通过事件回调函数。GLUT针对与底层视窗系统的交
互,提供给我们若干回调选项。在这里我们仅仅用一个“主”回调在一帧中渲染。这个函数会在GLUT内部循环
被不断地调用。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
这是我们第一次在OpenGL中遇到状态的概念。在状态背后的思想是,渲染是一项极其复杂的任务,以至于不能
像调一个函数那样接受了几个参数的方式来对待它(而且一个设计良好的函数不应该接受过多的参数)。你需
要制定着色器、缓存以及多种标记来影响渲染的进行。另外,你经常希望在一连贯的渲染中保持相同的参数不
变(例如,如果你不想禁调深度测试的话,就不需要在每次渲染调用时都指定禁用参数)。这就是为什么,大
部分渲染操作的参数都通过在OpenGL状态机中设置标记和值来完成,而且渲染调用本身通常限制在几个参数,
这些参数用来制定需要绘制的顶点数和它们的偏移量。再调用了一个改变状态的函数后,特定的参数依然完整
的存留着,直到下次用不同的值调用相同函数。上面那个调用就是这样设置颜色的,当需要清理帧缓存的时候
(帧缓存后面再分析)。颜色有4条通道(RGBA),被指定成0.0到1.0之间的某个标准值。
glutMainLoop();
这个调用告诉GLUT,由从此刻开始GLUT内部循环。在此循环中,它监听来自视窗系统的事件,然后把它们传
递给我们配置好的回调函数。在这个例子中,GLUT只会调用我们注册的函数,作为显示回调的RenderSceneCB
,以便我们能渲染帧。
glClear(GL_COLOR_BUFFER_BIT);
glutSwapBuffers();
在我们的渲染函数中,我们唯一做的事情就是清除帧缓存(用上面的颜色指令,改变它试试)。第二个调用告
诉GLUT,前缓存和后缓存对调。于是,在下一回合,再经过渲染回调时,会在当前的前缓存中渲染帧,而当前
的后缓存则用作显示。
译者总结:
1.OpenGL没有为各个平台提供窗口创建和显示API,而需要每个平台各自提供API并与OpenGL绑定。微软提供WGL,苹果提供CGL,而GLUT是把以上
集合起来的一个跨平台的程序库,使开发者能方便的、间接的调用WGL或CGL。
2.OpenGL是一个状态机,可以想象成它是一个不断在墙上刷油漆的机器人,你要做的只是在某些时刻设置它用什么颜色、以怎样的轨迹刷墙,
glClearColor、glClear就是这样的命令。
3.你可以在一开始就设置好渲染指令,也可以在程序运行过程中不断设置指令,实现后者的方式是提供一个回调函数给glutDisplayFunc,并通
过glutMainLoop不断监听视窗事件调用这个回调函数,从而实现实时设置指令。