OpenGL是什么
- 一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。
- 因为OpenGL规范并没有规定实现的细节,具体的OpenGL库允许使用不同的实现,只要其功能和结果与规范相匹配。
- 实际的OpenGL库的开发者通常是显卡的生产商。
核心模式与立即渲染模式
- 早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),这个模式下绘制图形很方便。OpenGL的大多数功能都被库隐藏起来,开发者很少能控制OpenGL如何进行计算的自由。
- 从OpenGL3.2开始,规范文档开始废弃立即渲染模式,这个分支的规范完全移除了旧的特性。
- 当使用OpenGL的核心模式时,OpenGL迫使我们使用现代的函数。当我们试图使用一个已废弃的函数时,OpenGL会抛出一个错误并终止绘图。
- 当使用新版本的OpenGL特性时,只有新一代的显卡能够支持你的应用程序。
扩展
- 当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。
- 如果一个程序在支持这个扩展的显卡上运行,开发者可以使用这个扩展提供的一些更先进更有效的图形功能。
- 使用扩展的代码示例:
状态机
- OpenGL自身是一个巨大的状态机。
- OpenGL的状态通常被称为OpenGL上下文。
- 我们通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲。我们使用当前OpenGL上下文来渲染。
- 当使用OpenGL的时候,状态设置函数将会改变上下文。状态使用函数会根据当前OpenGL的状态执行一些操作。
对象
- 在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态的一个子集。
- 使用一个对象时常用的结构:
- OpenGL常用的工作流:
- (1)首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)。
- (2)将对象绑定至上下文的目标位置。
- (3)设置窗口的选项。
- (4)将目标位置的对象id设回0,解绑这个对象。
- 具体实例如下所示:
- 设置的选项将被保存在objectId所引用的对象中,一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效。
- 在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。
- 在我们想绘制其中任何一个模型的时候,只需绑定一个包含对应模型数据的对象就可以了。
https://www.khronos.org/registry/OpenGL/index_gl.php