近来课程需要,跟着learnopengl.com学习了opengl,在此将要点记录以下。
学习网站:learnopengl(英文)learnopengl(中文)
一、OpenGL是什么
一般它被认为是一个API(Application Programming Interface, 应用程序编程接口),包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。
OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。至于内部具体每个函数是如何实现(Implement)的,将由OpenGL库的开发者自行决定(译注:这里开发者是指编写OpenGL库的人)。
实际的OpenGL库的开发者通常是显卡的生产商。
简言之,OpenGL只是一个标准/规范,具体的实现是由驱动开发商针对特定显卡实现的
所有版本的OpenGL规范文档都被公开的寄存在Khronos那里。例如OpenGL3.3规范文档
二、核心模式与立即渲染模式(Core-profile vs Immediate mode)
早期的OpenGL使用立即渲染模式(Immediate mode,也就是固定渲染管线),从OpenGL3.2开始,规范文档开始废弃立即渲染模式,并鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这个分支的规范完全移除了旧的特性。
三、扩展
OpenGL的一大特性就是对扩展(Extension)的支持,当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。
通过这种方式,开发者不必等待一个新的OpenGL规范面世,就可以使用这些新的渲染特性了。
通常,当一个扩展非常流行或者非常有用的时候,它将最终成为未来的OpenGL规范的一部分。
四、状态机
OpenGL本质上是个大状态机。
关于状态机的解释:一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。
状态设置函数(State-changing Function):这类函数将会改变上下文。
状态使用函数(State-using Function):这类函数会根据当前OpenGL的状态执行一些操作。
我们通常使用如下途径去更改OpenGL状态:
①设置选项(setting some options)
②操作缓冲(manipulating some buffers)
最后,我们使用当前OpenGL上下文来渲染(render using the current context)。
五、对象
OpenGL库是用C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。
由于C的一些语言结构不易被翻译到其它的高级语言,因此OpenGL引入了一些抽象层。
“对象(Object)”就是其中一个抽象概念。
在OpenGL中一个对象是指一些选项的集合,它代表OpenGL状态(即OpenGL上下文)的一个子集。
可以把对象看做一个C风格的结构体(Struct):
当我们使用一个对象时,通常看起来像如下一样(把OpenGL上下文看作一个大的结构体):
使用OpenGL时常见的工作流:
①首先创建一个对象,然后用一个id保存它的引用(实际数据被储存在后台)
②然后我们将对象绑定至上下文的目标位置
(例子中窗口对象目标的位置被定义成GL_WINDOW_TARGET)
③接下来我们设置窗口的选项。设置的选项将被保存在objectId所引用的对象中
④最后我们将目标位置的对象id设回0,解绑这个对象
因为之前设置的选项被保存在objectId所引用的对象中, 一旦我们重新绑定这个对象到GL_WINDOW_TARGET位置,这些选项就会重新生效
使用对象的好处:
我们可以定义多个对象,每个对象都可以是不同的设置。在我们执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。