在OpenGL的发展历程中,总是兼顾向下兼容的特性,但是到了一定的程度之后,这些旧有的OpenGL API不再适应时代的需要,还有一些扩展并不是驱动一定要实现的扩展,这些被统一划入可选的Compatibility Profile;而由OpenGL规范规定必须支持的扩展,则是Core Profile,想要支持先进的OpenGL,相应的Core Profile扩展必须被实现。
OpenGL在渲染的时候需要一个Context,这个Context记录了OpenGL渲染需要的所有信息,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性。在OpenGL 3.0版本之前,OpenGL创建Context都是一致的,随着升级会新增一些内容(例如从OpenGL1.1升级到1.5,会新增一些状态变量或者属性,并添加一些设置这些内容的函数),整体上来说没有什么大的变化。但是从OpenGL 3.0开始,OpenGL为了摆脱历史的“包袱”,想要彻底的废弃掉之前的许多特性,但是无奈市面上已经有大量依赖OpenGL之前版本的代码,导致OpenGL维护小组的这一想法难以付诸实施,于是在OpenGL 3.1开始引入了OpenGL Context的一些分类,比如引入了CoreProfile等概念,之后随着版本发展到3.3,一切算是确定下来。
正是由于OpenGL的这一变化过程以及其间引入的各种概念,导致初学者学习OpenGL时非常的痛苦,本来OpenGL API对于一般开发者来说就是晦涩难懂,如今还引入这些内容真的是令开发者压力山大。
在OpenGL 3.0版本之前,所有的OpenGL Context是统一的,都是一种兼容之前版本的模式(例如使用OpenGL 1.1编写的代码,在支持OpenGL 2.1的设备上可以正常的运行)。这些版本的OpenGL API也被称之为固定管线(相比较之后引入shader的可编程管线来说), 但是从3.0开始有了变化:
1、 OpenGL 3.0 引入了废弃机制,标记了许多OpenGL的函数是废弃的(但是3.0并没有真正移除它们,也就是说3.0版本仍然是一个可以向后兼容的Context)
2、 OpenGL 3.1发布删除了之前3.0标记的过时函数(固定管线相关的函数),但是为了之前的OpenGL代码可用, 引入了一个扩展ARB_compatibility,这个扩展可以让OpenGL 3.1支持之前的OpenGL固定管线的内容。
但是ARB_compatibility有许多问题:它将OpenGL的核心函数core profile和之前的固定管线函数绑定在了一个合集内,也就是说实现core profile函数集不能包含compatibility中不存在的函数,用户不能够要求一种Context只包含core profile的内容,这个扩展定义的函数是一个合集,core profile只是它的一个子集。两个关系类似于:(也就是说类似于一个套餐,你不能只想要你需要的那部分)
ARB_compatibility
3、 正是由于这个问题,在OpenGL 3.2中正式引入了模式的概念(Profile),模式就将二者分离开来了。OpenGL 3.2 中模式包括:
(1) Core Profile 只包含最新的Shader相关的函数,程序必须使用Shader编写
(2)compatibility Profile 可以兼容之前的OpenGL固定管线的内容,也可以使用Core Profile中的内容
这样分开之后,开发者可以显式的要求创建某一种Profile来使用
4、 3.2以后的版本直到OpenGL目前最新的版本(OpenGL 4.6)都是按照这种模式来做的。
另外还有一个模式的称之为:Forward compatibility
这个是什么意思呢?第一眼看好像是向前兼容的感觉(有点类似于compatibility的意思),实际上并不是,它的真正含义是向“未来”兼容,什么是面向“未来”呢?说白了就是把所有OpenGL API中标记有deprecated标签的函数都禁用。(只对OpenGL 3.0及其以上版本有作用),具体来说是:
(1) OpenGL 3.0(3.0中标记了一些函数是deprecated),如果设置该标记,那么这些函数都不可用;
(2) OpenGL 3.1 (所有3.0和3.1中标记为deprecated的函数都不可用);
(3) OpenGL 3.2+ compatibility Profile Context: 没有任何作用,毕竟人家是compatibility的(向后兼容);
(4) OpenGL 3.2+ core Profile Context: 凡是标记为deprecated的函数都不可用;