当前顶点状态和顶点数组——OpenGL ES Common/Common-Lite 规范(版本 1.1.12)

当前顶点状态

当一个顶点数组被定义,但是数据还不可用时,当前值常用于联合顶点辅助的数据。当前值可能在任何时候被独占命令改变。

使用以下的命令可设置当前的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将产生。

CommandSizesTypes
VertexPointer2,3,4byte,short,fixed,float
NormalPointer3byte,short,fixed,float
ColorPointer4Ubyte,fixed,float
PointSizePointerOES1Fixed,float
TexCoordPointer2,3,4Byte,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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值