状态机是理论上的一种机器,呃这个说法非常非常的抽象。通俗一点理解,状态机描述了一个对象在其生命周期内所经历的各种状态,状态间的转变,发生转变的动因,条件及转变中所执行的活动。或者说,状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列以及对那些状态事件的响应。因此具有以下特点:
1.有记忆功能,能记住其当前的状态;
2.可以接收输入,根据输入的内容和自己的原先状态,修改自己当前状态,并且可以有对应输出;
3.当进入特殊状态(停机状态)的时候,变不再接收输入,停止工作;
虽然还是很抽象,但结合实例理解就容易明白了,如身边的电脑,就是一典型的状态机,对照理解如下:
1. 电脑的存储器(内存、硬盘等),可以记住电脑自己当前的状态(如保存在电脑中的数据,即二进制的值,都属于当前的状态);
2. 电脑的输入设备接收输入(键盘和鼠标输入等),根据输入的内容和自己的状态,修改自己的状态(修改内存中的值),并且可以得到输出(将结果显示到屏幕)。
3. 当进入关机状态的时候,它不再接收输入,停止工作。
同理,OpenGL也可以类似这样的理解:
1. OpenGL可以记录自己的状态(如当前所使用的颜色、是否开启了混合功能等);
2. OpenGL可以接收输入(当调用OpenGL函数的时候,实际上可以看成OpenGL在接收我们的输入),如我们调用glColor3f,则OpenGL接收到这个输入后会修改自己的“当前颜色”这个状态;
3. OpenGL可以进入停止状态,不再接收输入。在程序退出前,OpenGL总会先停止工作的。
可通过一些OpenGL函数来获取OpenGL的当前状态,如下:
1)glEnable启用状态,而glDisable来禁用它们。例如:
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);
2)glIsEnabled函数检测这些状态是否被开启。例如:
glIsEnabled(GL_BLEND);
如果状态是开启的,则glIsEnabled函数返回GL_TRUE(宏定义为1);否则返回GL_FALSE。
设置OpenGL状态
既然有getXXX这样的函数来取得OpenGL的状态,那么为什么没有setXXX这样的函数来设置OpenGL状态呢?
因为OpenGL已经提供了大量的函数来设置状态了:glColor*, glMaterial*, glEnable, glDisable, 等等,大多数OpenGL函数都是用来设置OpenGL状态的,因此不需要再设计一个setXXX函数来设置OpenGL状态。
从“状态机”的角度来看。状态机根据输入来修改自己的状态,而不是由外界直接修改自己的状态。所以不设置setXXX这样的函数,也是很合理的。
以上的笔记是我之前浏览某位同学写的不错的关于对OpenGL状态机的帖子,抽取出来加深理解。该帖子还有不少例子大家可以看看https://www.cnblogs.com/Anita9002/p/4415239.html