OpenGL(一): 简介
OpenGL:通常被认为是一个包含了一系列可以操作图形、图像的函数API。然后,其本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范。
早期的OpenGL使用立即渲染模式(固定渲染管线),这个模式下绘制图形很方便。该模式容易使用和理解,但是效率太低。开发者迫切希望能有更多的灵活性,故从OpenGL3.2开始,规范开始废弃立即渲染模式,并鼓励开发者在核心模式下进行开发。
OpenGL能用来开发跨平台的渲染引擎,在Android、OSX、iOS、Windows、PS等平台均可使用。
OpenGL 和 DirectX的比较
-
OpenGL只能做渲染,DirectX除了渲染以外还有其他功能,比如DirectX里面包含d3dxmath可以用来做3D数学运算;DirectX包含的外部设备接口模块可以用来接收外部设备的输入。
-
OpenGL只是一个定义了一些接口的标准,只要实现了这些接口,就算是实现了OpenGL,DirectX则只有微软自己实现的那一部分代码,所有人都只能使用微软提供的代码。
-
OpenGL可以跨平台,几乎所有平台都支持OpenGL,而DirectX则只有微软自己的Xbox和windows支持。
-
性能方面,OpenGL逊色于DirectX。
扩展
OpenGL的一大特性就是对扩展的支持。当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。
状态机
OpenGL自身是一个巨大的状态机(State Machine):一系列的变量描述OpenGL此刻应当如何运行。OpenGL的状态通常被称为OpenGL上下文(Context)。通常使用如下途径去更改OpenGL状态:设置选项,操作缓冲,然后我们使用当前OpenGL上下文来渲染。
我们使用状态设置函数(State-changing Function)来改变上下文,使用状态使用函数(State-using Function)根据当前OpenGL的状态执行一些操作。
对象
OpenGL库是由C语言写的,同时也支持多种语言的派生,但其内核仍是一个C库。为了适应现代编程语言的开发,OpenGL开发的时候引入了一些抽象层。“对象”就是其中之一。
在OpenGL中,一个对象是指一些选项的集合。它代表OpenGL状态的一个子集。例如,我们可以用一个对象来表示绘图窗口的设置,之后我们就可以设置它的大小、支持的颜色位数等。也可以把对象看做一个C风格的结构体(Struct):
struct object_name {
float option1;
int option2;
char[] name;
};
使用对象又一些好处。在程序中,我们可以定义多个对象,并设置他们的选项,每个对象都可以是不同的设置。我们在执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。
比如,我们有一些作为3D模型数据(一栋房子)的容器对象。在我们想绘制其中任何一个模型的时候,只需要绑定一个包含对应模型数据的对象就可以了。
OpenGL开发准备
在我们画出出色的效果之前,首先要做的就是创建一个OpenGL上下文(Context)和一个用于显示的窗口。如同我们要绘制一副漂亮的油画,先要准备好画板和画纸一样。
然而,创建上下文和窗口在每个系统上都是不一样的,OpenGL有目的地将这些操作抽象出去。所以我们需要自己处理创建窗口,定义OpenGL上下文以及处理用户输入。
幸运的是,有一些非常好的库已经为我们提供了所需的功能,避免了我们重复造轮子。比较流行的几个库有GLUT、SDL、SFML、GLFW。下面我们使用GLFW库来完成这一系列操作。
GLFW
GLFW是一个专门针对OpenGL的C语言库。它提供了一些渲染物体所需的最低限度的接口,它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。
GLAD
由于OpenGL只是一个标准/规范,具体的实现都是由驱动开发商针对特定显卡实现的。所以OpenGL驱动版本众多,大多数函数的位置都无法在编译时确定下来,需要在运行时查询。GLAD库能帮开发者解决了这个繁琐的问题。
使用CLAD在线服务可以快速配置好GLAD,大家可以按照自己的实际情况自行配置。
OpenGL的简单介绍和需要使用的开发库就先介绍到这里。下章介绍Mac下OpenGL开发环境的搭建。