opengl属性组

在“基本状态管理”一节里,你已经看到了如何设置或查询一个个别的状态或状态变量。那么好,你也能够用一个简单的命令保存和恢复一组相关的状态变量的值。

OpenGL将相关的状态变量组合到一个属性组里面。例如,GL_LINE_BIT属性就包括五个状态变量:线宽,GL_LINE_STIPPLE的开启状态,点画线的模式,点画线重复次数,GL_LINE_SMOOTH的开启状态。(参看第六章的“反走样”)使用命令glPushAttrib()和glPopAttrib(),你可以一次性保存和恢复这五个状态变量。

一些状态变量不只是存在于一个属性组中。例如,状态变量GL_CULL_FACE就都存在于多边形和开启属性组。

在OpenGL版本1.1中,有两个不同的属性栈。除了原有的属性栈之外(保存服务器端的状态变量值),还有一个客户端的属性栈,是使用glPushClientAttrib()和glPopClientAttrib()进行存取的。

总的来说,使用这些命令比你自己单独进行获取,保存,恢复要快。有些值可能在硬件端保存,要获取它们的值是很不值得的。还有,假如你是在一个远程的客户端上操作,当所有的属性数据进行获取,保存,恢复的时候就必须通过网络进行来回传输。当然,你的OpenGL实现将在服务器端维持这些属性栈,避免了不必要的网络延迟。

这儿有大约20个属性组,它们都能够使用glPushAttrib()和glPopAttrib()分别进行保存和恢复。这儿有两个客户端的属性组,它们是使用glPushClientAttrib()和glPopClientAttrib()进行保存和恢复的。对于服务端和客户端属性都是保存在栈里面的,这些栈至少能够保存16个属性组。(对于你的OpenGL实现实际上能够保存多少,你可以使用glGetIntegerv()带参数GL_MAX_ATTRIB_STACK_DEPTH和GL_MAX_CLIENT_ATTRIB_STACK_DEPTH进行查询)在已经满的栈里面保存或在一个空的栈里面取数据都将产生一个错误。


void glPushAttrib(GLbitfield mask);
void glPopAttrib(void);
glPushAttrib()将mask指示的属性值进行压栈。glPopAttrib()恢复那些用最近一次glPushAttrib()进行保存的属性值。表2-6列出了所有可能的掩码值,这些掩码能够用逻辑或操作符联合起来使用。每一位对应一个单独的状态变量集合。例如,GL_LIGHTING_BIT指的是所有跟光照相关的变量,包括当前的材质颜色,周围环境,漫射,反射,散光,开启的光源列表,和点光源的方向。当调用glPopAttrib()时,所有这些变量就恢复。
GL_ALL_ATTRIB_BITS是一个特殊的掩码,它用来保存和恢复所有属性组的所有状态变量。

表2-6:属性组


void glPushClientAttrib(GLbitfield mask);
void glPopClientAttrib(void);
glPushClientAttrib()保存所有用mask指示的属性值,并压栈。glPopClientAttrib()恢复最近一次用glPushClientAttrib()保存的属性值。表2-7列出了所有可能的掩码值,这些掩码能够用或操作符联合起来使用。
这儿有两个客户端的属性组,反馈和选择,不能用栈的机制进行保存和恢复。

表2-7:客户端的属性组
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值