1.1 简介
- 一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。
- 实际的OpenGL库的开发者通常是显卡的生产商。
1.2核心模式与立即渲染模式
- 早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。
- 当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。
1.3 扩展
-
OpenGL的一大特性就是对扩展(Extension)的支持
-
大多数的扩展如下
if(GL_ARB_extension_name) { // 使用硬件支持的全新的现代特性 } else { // 不支持此扩展: 用旧的方式去做 }
1.4 状态机
- OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。
- OpenGL的状态通常被称为OpenGL上下文(Context)。
- 我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。最后,我们使用当前OpenGL上下文来渲染。
- 状态设置函数(State-changing Function),这类函数将会改变上下文
- 状态使用函数(State-using Function),这类函数会根据当前OpenGL的状态执行一些操作
1.5 对象
- 在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。
- 例子
// 创建对象
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);
我们首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。然后我们将对象绑定至上下文的目标位置(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET
)。接下来我们设置窗口的选项。最后我们将目标位置的对象id
设回0,解绑这个对象。设置的选项将被保存在objectId
所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET
位置,这些选项就会重新生效。
- 使用对象的一个好处是在程序中,我们不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。