2.2 GL State
GL是一个巨大的状态机,所有状态都在spec层次被定义,所以是硬件无关的。本spec将在介绍glAPI的同时介绍相关状态。GL state包括两部分:server state和client state。server state被保存在server side,而client state则被保存在client端,参见section2.1关于server/client的讨论。绝大部分的state都属于server state,所以,除非特别指出,本文提到的state都是server state。
GL context是GL state的一个封装,如section1.3介绍,一个进程可以创建多个GL context,而多个GL context之间还可以共享状态,即只有状态的一份物理拷贝,所有参与共享的GL context都使用该物理拷贝。由于可以共享的状态往往都是一个object,诸如vertex buffer object、program and shader object、render buffer object、sync object、texture object (except for texture object named zero),所以,这项技术可以被称为share context或者share object。由于context是由native window system其上的API创建的,参见section1.7.2,所以,该技术也在该API上定义,和glAPI无关。
2.3 GL Command Syntax
GL command以c函数的形式存在,即本系列定义的所谓glAPI。由于GL中存在大量只有函数参数个数和类型不同的函数,而C语法又不支持函数重载,所以GL使用了以下形式来定义这些重载函数:
returnType glAPIName{1/2/3/4}{b/s/i/i64/f/d/ub/us/ui/ui64}{v}(其他参数, T arg1, T arg2, …, 其他参数)
其中,{1/2/3/4}表示函数名中该部分可能是1、2、3、4或者所有数字都不出现。该数字代表了函数参数中相关的参数个数;如果数字不出现,表示不存在因为参数个数而引起的重载。
{b/s/i/i64/f/d/ub/us/ui/ui64}表示函数名中该部分可能是b、s、i…或者所有字母都不出现。这部分代表了函数参数中相关的参数类型,其中,b表示GLbyte,s表示GLshort,…,如下图所示(GLbyte、GLshort等是由GL定义的数据类型,图中省略了类型前缀GL,以下简称glType);如果这部分没有在函数名中出现,表示不存在因为参数类型而引起的重载。
(其他参数, T arg1, T arg2, …, 其他参数)中,“其他参数”存在或不存在都是可能的,这里我们只对“T arg1, T arg2, …”感兴趣,其参数个数和参数类型就是由函数名中的相应部分决定的。
如果函数名最后还包括v,则函数参数形式变成(其他参数, T* arg, 其他参数),数组arg的类型和大小也由函数名中相应部分决定。
最后还需要说明的是,以上只是需要模拟函数重载的glAPI部分,其他的glAPI如何定义并不受影响,比如其他glAPI还完全可以使用更多的glType。GL所定义的所有类型如下图所示(图中的类型省略了前缀GL)。需要说明的是,glType并不是c语言中的type,比如GLint和c语言中的int在spec并无任何关系,只是发现c语言中的int类型刚好满足GL规定的对GLint的要求,所以,基本上GL实现者都会在驱动软件(一般使用c/c++实现)内部使用int来接受GLint。另外,GL还定义了其他的数据格式,以GLenum形式存在,并不被包括在下图中,因为下图列出的是可以定义其他变量的数据类型,类似c语言中int、float等关键词。