OpenGL是以状态机来实现的.你输入的各种不同的状态会一直保留到当你再次改变它们.那么现在你知道了,比如像"当前颜色"之类的东西其实也就是一个状态变量.你可以设置你想要的任何颜色,白色,红色,黄色等等.当然如果你一直没有改变这一状态,后面所有被绘制的物件都将以这一颜色状态显示.
"当前颜色"仅仅只是保持OpenGL可以出色运作所需众多状态变量中很小的一个.你更可以控制一些比如观察,投影之类的变换;线,图形的绘制模式;独一无二的灯光;美伦美奂的物体材质.
在OpenGL中有许多的状态都依靠glEnable()或者glDisable()来控制.每一个状态变量或方式都有一个预先定义的值.当然,你也可以通过一些特定函数来对当前的状态进行查询.通常,你可以使用以下六个之一个典型命令来完成这一需要:
glGetBooleanv(),glGetDoublev(),glGetFloatv(),
glGetInterv(),glGetPointerv(),glIsEnable().
他们依靠你输入的数据类型来回答关于某个状态的情况.一些状态有特殊的查询命令(比如glGetLight*(),glGetError(),glGetPolygonStipple()等等).
另外!!你可以通过压栈命令(glPushAttrib(),glPushClientAttrib())的方式临时修改他们,不久后又恢复(glPopAttrib(),glPopClientAttrib())他们.对于一些临时改变,他们往往更加的有效率.
关于状态机
一般来讲,一个状态机的设计模式包含:
1.一组状态集(states),
2.一个起始状态(start state),
3.一组输入符号集(alphabet),
4.一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型.
当输入符号串,模型随即进入起始状态。它要改变到新的状态,依赖于转换函数。在有限状态机中,会有有许多变量,例如,状态机有很多与动作(actions)转换(Mealy机)或状态(摩尔机)关联的动作,多重起始状态,基于没有输入符号的转换,或者指定符号和状态(非定有限状态机)的多个转换,指派给接收状态(识别者)的一个或多个状态,等等.
状态变化机制,状态变化实际是由Event事件驱动的,可以认为是Event-condition-State,在MVC模式一般是Event-condition-Action实现。状态模式需要封装的是Event-condition-State中的condition-State部分。