(仅是草稿,未做整理)
2.2 GL状态
GL维护着相当多的状态。此文档会枚举每一个状态变量,并描述这些状态如何转变。为便于讨论,状态变量将根据它们的函数功能而进行整理。虽然我们描述在帧缓存中的操作,但帧缓存并不是GL状态的一部分。
这里有两种状态需要区别对待。第一个状态是GL服务端状态(GLserver state),运行于服务端。大部分GL状态属于些状态。第二状态是GL客户端状态(GL client state),运行于客户端。除非有注明,否则此文档所涉及到的状态都是服务端状态。客户端状态会明确标明。每一个GL上下文的事例,都有一个完整的服务状态组合。客户端与服务端的每一个连接都有一个服务端状态组合和客户端状态组合。
虽然实现GL可能与硬件有关,但此讨论将与在特定的硬件上实现GL是无关联的。只有在图形硬件与GL状态确切地与GL状态相关,我们才会关注图形硬件的状态。
2.3 GL命令语法
GL命令也可以说是函数或过程。多组命令可能有相关的功能,其中的区别在于参数如何给定。为方便起见,我们采用一种标志来描述命令和参数。
GL命令组成,首先是名字,后面为根据特定命令,最多4字符部分。第一字符表示此命令参数个数。第二字符或字符对表示参数类型,如8位整型,32位整型,32位定点数,或单精度浮点数。如果有最后一个字符v,表明命令需要一个数组(向量)指针值,而不是一系列各个的参数。
两个示例:
void Color4f( float r,float g,float b,float a );
void GetFloatv( enum value,float *data );
此两例子是用ANSI C来描述这些命令。总之,一个命令的形式有以下形式1:
rtype是函数的返回类型,{}号包含所选中的一系列的字符(或者字符对)。表示没字符。参数包含在[]中,有参数或无参数皆可。从arg1到argN的N个参数的类型为T,对应表示如表2.1所示。如果没有参数,那么参数类型将显式给定。如果最后个字符不是v,那么N值将会是数字1,2,3或者4(如果没有数字,那么参数个数是固定的)
---------------------------------------------------------------------------------
注1 文档中的描述适用于ANSI C语言,如C++和Ada,即允许传递的参数类型的信息,可以有简单的声明和较少的入口点
表2.1:GL命令后缀字母对应的参数类型。参考表2.2,GL类型定义。
如果最后一个字符为v,那么只有arg1参数,且是有N个数值的数组。最后我们把unsigned类型用u来表示。并写在类型前头(例如,unsingned int缩写成uint)。
示例:
void Normal3{xf}( T arg );
可以表示两函数
void Normal3f( float arg1,float arg2,float arg3 );
void Normal3x( fixed arg1,fixed arg2,fixed arg3 );
类型已经确定的(如没有后缀的命令)有13种类型(指针也在其中),详见表2.2
GL数据类型和指定语言的数据类型的映射关系是指定语言所定义的一部分内容,并且可能是平台相关性的。在类型混合使用及参数归一化的时候,出现的类型转换和类型扩展是由语言和平台来定义实现。如,在C语言中有整型和浮点数据会自动类型转换。但是不包括GL类型中的整型和定点或浮点和定点,因为定点数据不是一个内建类型。可以忽略语言的是enum类型无截断转换成定点数,整型数据转换成定点数要乘于2^16
2.4 基本的GL运行
图2.1是GL的示意图,命令从左边进入GL。一些命令是要绘制几何对象,而另一个是控制命令。
表2.2GL数据类型
GL数据类型并不是C语言类型。如:GL类型int,用在GLint并不在本文档范围之类,必不必等同于c语言中的int类型。在实现GL时,可以用比表中所指定的GL类型以更多的比特数。但是一个正确的整型数值,如果超出最小范围的数值,那么指定更多的bit也不是必须的。
ptrbits是指指针类型所需要的bit数,换句话说,intptr和sizeptr必须足够大,从而可以保存任何地址。
图2.1 GL示意图
不同阶段的对象处理过程:
第一阶段,所要操作的几何元素以顶点的形式出现:点,线段和三角形。顶点被转换,点燃(lit),而元素被翻转成viewing volume,从而为第二阶段做准备。
第二阶段,光栅化。通过用二维形式所描述的点,线段和三角形生成多个帧缓存地址和数值。产生的每一分片(fragment)用于下一个阶段。
第三阶段,处理每个独立的分片,然后改变帧缓存。其中操作包括基于当前或之前已经保存的深度值(影响深度缓存)帧缓存更新,混合当前分片和已经保存的颜色的帧缓存更新,及mask和其他分片逻辑操作的帧缓存更新。
数值也会从帧缓存读出,或者从帧缓存的部分内容复制到其他部分。这些转换可能会涉及到一些解码和编码。
这个顺序只是作为描述GL的一个工具,并不是实现GL的一个强制约束规则。我们只是提供一种组织GL多样操作的一种方式而已。