2.9 属性组

在2.3节中,我们学到了如何设置或查询一个单独的状态或状态变量。也可以用一个命令保存或恢复一组相关的状态变量的值。

OpenGL将相关的状态变量进行归组,称为属性组(attribute group)。例如,GL_LINE_BIT属性包括了5个状态变量:直线的宽度、GL_LINE_STIPPLE启用状态、直线点画模式、直线点画重复计数器和GL_LINE_SMOOTH启用状态。使用glPushAttrib()和glPopAttrib()函数,可以同时保存和恢复全部这5个状态变量。

从函数名中可以看出,属性的保存是通过入栈和出栈的形式保存的。OpenGL 1.1版本中,有两个不同的属性堆栈。除了原来的属性堆栈外(用于保存服务器状态变量的值),还有一个客户属性堆栈,是通过glPushClientAttrib()和glPopClientAttrib()函数访问的。

OpenGL大约有20个不同的属性组,它们都可以用glPushAttrib()和glPopAttrib()进行保存和恢复。客户属性组共有2个,它们可以用glPushClientAttrib()和glPopClientAttrib()进行保存和恢复。无论是在服务器还是在客户机上,属性都存储在堆栈上。属性堆栈的深度至少可以保存16个属性组(可以调用glGetIntegerv()函数,以GL_MAX_ATTRIB_STACK_DEPTH和GL_MAX_CLIENT_ATTRIB_STACK_DEPTH为参数,查询OpenGL所支持的堆栈深度)。当堆栈满了之后,在向堆栈中压入元素,将会产生错误。

void glPushAttrib(GLbitfield mask);
void glPopAttrib(void);

glPushAttrib()保存由mask指定的所有属性,把它们压入到属性堆栈中。glPopAttrib()恢复上一次调用glPushAttrib()时所保存的状态变量的值。

mask可以取下面的一些值,或者这些值的或运算的结果。
GL_ACCUM_BUFFER(累积缓冲区), GL_ALL_ATTRIB_BITS(所有属性组), GL_COLOR_BUFFER_BIT(颜色缓冲区), …用到的时候再查吧。

void glPushClientAttrib(GLbitfield mask);
void glPopClientAttrib(void);

glPushClientAttrib保存由mask掩码指定的所有属性,把它们压到客户属性堆栈中。glPopClientAttrib()恢复上次调用glPushClientAttrib()时保存的那些状态变量的值。
这个客户属性堆栈的mask与前面的属性堆栈的mask,取值不一样。客户属性组的mask可以取下面3个值,GL_CLIENT_PIXEL_STORE_BIT(像素存储), GL_CLIENT_VERTEX_ARRAY_BIT(顶点数组),GL_ALL_CLIENT_ATTRIB_BITS。当使用选择或者反馈模式的时候,客户属性组无法入栈和出栈。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值