当前顶点状态
当一个顶点数组被定义,但是数据还不可用时,当前值常用于联合顶点辅助的数据。当前值可能在任何时候被独占命令改变。
使用以下的命令可设置当前的RGBA颜色值。
void Color4{xf}(T red, T green, T blue, T alpha);
void Color4ub(ubyte red, ubyte green, ubyte blue, ubyte alpha);
整型颜色元素(R,G,B,A)到浮点数值的转换将在以后讨论。
Color4f和Color4x通常接受0.0到1.0之间的值,0.0代表最小值,1.0代表最大值(依赖机器)。超过[0,1]的值不被接受。
当前的规格化使用以下命令。
void Normal3{xf}(T nx, T ny, T nz);
当前的均匀纹理坐标使用一下命令。
void MultiTexCoord4{xf}(enum texture, T s, T t, T r, T q);
当前坐标的设置按照texture参数被修改,s,t,r 和q坐标单独设置。texture是一个TEXTUREi格式的标志常量,指明修改纹理坐标i被修改。
这个常量遵守 TEXTUREi = TEXTURE0+i(i在0到k-1的范围内,k是通过 MAX_TEXTTURE_UNITS定义的纹理单元的执行依赖数值)。
获取CURRENT_TEXTURE_COORDS返回纹理的坐标设置,该值通过ACTIVE_TEXTURE定义。
通过MultiTexCoord4设置一个无效的纹理坐标值将导致一个未定义的行为。
状态要求提供顶点4个值组成的,用于保存当前RGBA颜色值,3个值保存当前规格,每个纹理单位需要4个值保存它们的坐标值s,t,r和q。最初的颜色是(R,G,B,A)=(1,1,1,1)。初始化的当前规格为(0,0,1)。每个纹理单位当前的纹理坐标的s,t和r的初始值为0,q的初始化值为1。
顶点数组
顶点数据放置在客户端或者在服务器的数组中保存,在这些数组中的数据块可能当时用于在一个正在执行的GL命令中定义多个简单几何对象。客户端可能制定4个正值大小的MAX_TEXTURE_UNITS数组:每个都保存顶点的坐标,规格,颜色,点大小,以及1个或多个纹理坐标集合。命令:
void VertexPointer(int size,enum type,sizei stride,void*pointer);
void NormalPointer(enum type,sizei stride,void*pointer);
void ColorPointer(int size,enum type,sizei stride,void*pointer);
void PointSizePointerOES(enum type,sizei stride,void*pointer);
void TexCoordPointer(int size,enum type,sizei stride,void*pointer);
描述了这些数组的位置和组织。对于每个命令,type定义了保存在数组的数据的类型;size指明数组中每个顶点值的数量;因为规格化永远使用3个值定义,指向的大小永远固定一个值,所以NormalPointer 和 PointSizePointerOES没有size参数。表2.4指明了允许的值和类型。type可以使用BYTE,UNSIGNED_BYTE,SHORT,FIXED和FLOAT关键字分别指明byte,ubyte,short,fixed,和float类型。如果size指定的非表中的值,错误INVALID_VALUE将产生。
Command | Sizes | Types |
VertexPointer | 2,3,4 | byte,short,fixed,float |
NormalPointer | 3 | byte,short,fixed,float |
ColorPointer | 4 | Ubyte,fixed,float |
PointSizePointerOES | 1 | Fixed,float |
TexCoordPointer | 2,3,4 | Byte,short,fixed,float |
表2.4:顶点数组大小(每个顶点的值)和数据类型
数组中的一个,两个,三个或者四个值组成一个顶点,它们代表了一个数组元素。每个数组元素的值顺序的保存在内存中。如果stride 为0,数组元素仍然会被顺序保存。如果stride为负数,将会产生一个INVALID_VALUE的错误。除此之外,stride告诉指针,第i个元素和第i+1个元素之间的机器单元(通常为无符号字节)步长,第i+1个元素的指针更大些。每个命令中,pointer定义了内存中,某个数组中第一个元素的第一个值的位置。
一个单独的数组可以使使用以下2个调用来实现可用 或 不可用
void EnableClientState(enum array);
void DisableClientState(enum arry);
一个数组 根据代表不同的对象: 顶点,规格化,颜色,指针大小或者纹理坐标数组,分别被设置为VERTEX_ARRAY,NORMAL_ARRAY,COLOR_ARRAY,POINT_SIZE_ARRAY_OES或者TEXTURE_COORD_ARRAY。
命令
void ClientActiveTexture(enum texture);
用于选择顶点数组客户端参数,该参数的值可通过TexCoordPointer命令修改,数组设置为TEXTURE_COORD_ARRAY,并受到EnableClientState和DisableClientState设置的影响。这个命令设置客户端状态变量CLIENT_ACTIVE_TEXTURE。每个纹理单元有一个客户端状态向量,当该命令被调用,向量将被选中。这个状态向量包括顶点数组状态。这个调用也可以选择某个纹理单元的客户端状态向量,用于客户端状态的查询。
指定一个无效的texture将产生一个INVALID_ENUM得错误。texture有效值将和MultiTexCoord命令中使用的一样。
转换数组元素
当使用DrawArrays和DrawElements命令去转换一个数组元素i时,每个可用数组使用不同的处理方式。
对于顶点数组,如果size是2,则数组将定义顶点的x和y的坐标值,此时z和w坐标值将分别被设置为默认值0和1。如果size值为3,则数组的x,y,z被定义,而w的设置为默认值1。如果size为4,则所有的坐标值被定义投影空间中任意一个点坐标。
对于颜色数组,四个组件永远需要定义。如果颜色数组不可用,当前的颜色将使用上次的Color命令定义的颜色。
对于规格化数组,所有的3个坐标值永远需要定义。Byte,short,或者integer值被转换为浮点值,用于和表2.7中的类型保持一致。如果规格化数组不可用,则当前规格化的值使用上次Normal命定义的值。
对于点大小的数组,唯一的大小永远需要定义,如果点大小的数组不可用,当前点大小的值将使用上次PointSize命令定义的值。
对于纹理坐标数组,如果size是2,即s和t坐标需要定义,而r和q坐标分别设置成默认值0和1。如果size是3,即s,t和r需要定义,而q被设置成默认值1。如果size为4,即s,t,r,q全部需要定义。如果纹理坐标数组不可用,则当前纹理坐标值使用上次MultiTexCoord命令所定义的值。
命令
void DrawArrays(enum mode, int first, sizei count);
通过转换从第first到第first+count-1元素的可用数组 构造一系列的简单几何对象。mode定义了是构造何种简单对象。
DrawArrays命令执行后,对于可用的当前颜色,规格化,点大小和纹理坐标值的数组,它们将变成不确定的值;如果数组不可用,DrawArray命令则不会修改它们。
如果定义first为小于0的值,将会导致未定义的行为,并产生INVALID_VALUE的错误。
命令
void DrawElements(enum mode, sizei count, enum type, void *indices);
通过转换count个元素给GL,去构造一系列的简单几何对象,这写些元素被保存在indices指向的内存地址处。DrawElement命令使用indices[i]指向元素的可用数组构造第i个元素。type必须是UNSIGNED_BYTE或者UNSIGNED_SHORT,indices指向的GL类型ubyte或者ushort。mode定义了构造简单几何对象的类型,它同DrawArrays命令参数mode具有相同的值。
DrawElements命令执行后,对于可用的当前颜色,规格化,点大小和纹理坐标值的数组,它们将会变成不确定值;如果数组不可用,这些数组不会受到修改。
如果支持纹理单位的数目(MAX_TEXTURE_UNITS)为k,则执行顶点数组的客户端状态需要 由一个integer记录客户端激活纹理单位的选择器,4+k个布尔值,4+k个内存指针,4+k个整型值几率stride,4+k个常量符号代表数组的类型,2+k个整型值表示每个元素的需要定义的值数。初始状态时,客户端激活纹理单位的选择器为TEXTRUE0,布尔值为flase,内存指针为null,每个stride为0,每个元素的需要定义4个值。对于Common profile,数组的类型为FLOAT,对于Common-Lite profile,数组的类型为FIXED。