1 Get Started
什么是 OpenGL?¶
我之前一直把OpenGL理解为一个图形库,就像我大一上学习的EasyX那样,有一些画三角形的函数之类的。但实际上 OpenGL仅仅只是由一个组织指定并维护的规范。
这个规范的意思是OpenGL规范了每个函数应该如何执行以及它们的输出值,而每个显卡厂商根据自身显卡开发不同的OpenGL库来使用自家的显卡,所以OpenGL的开发者一般是显卡的厂商,不同显卡厂商所开发出来的OpenGL库并不相同。
状态机¶
理解OpenGL本身是一个巨大的状态机是学习OpenGL的关键,而OpenGL的状态通常被称为OpenGL的上下文,我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。
OpenGL中包含一些状态设置函数,这些函数会改变上下文;也包含一些状态使用函数,这些函数会根据当前OpenGL的状态执行一些操作。
对象¶
在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。比如,我们可以用一个对象来代表绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等等。可以把对象看做一个C风格的结构体(Struct)。
然后一般我们使用一个对象的时候,通常如下述代码所示
// 创建对象
unsigned int objectId = 0;
glGenObject(1, &objectId);
// 绑定对象至上下文
glBindObject(GL_WINDOW_TARGET, objectId);
// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);
glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);
// 将上下文对象设回默认
glBindObject(GL_WINDOW_TARGET, 0);
这一小段代码展现了你以后使用OpenGL时常见的工作流。我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET
)。接下来我们设置窗口的选项。最后我们将目标位置的对象id设回0,解绑这个对象。设置的选项将被保存在objectId
所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET
位置,这些选项就会重新生效。
上面这部分都是网站的原文,我用我自己的话说一遍就是,我先创建一个对象,得到相应的编号objectID
, 然后和OpenGL的上下文的 GL_WINDOW_TARGET
做绑定,说明这个对象是 GL_WINDOWS_TARGET
, 并且现在对GL_WINDOWS_TARGET
的操作就是对ID为 objectID
的对象进行操作,设置完成后将上下文绑定为默认即可。
这个流程会在绘制三角形部分着重阐述,学习完那一节后会对对象的操作有更深刻的理解。