三、理解OpenGL是一个状态机

Posted by 卢小胖 on 2023-09-16
Estimated Reading Time 2 Minutes
Words 850 In Total
Viewed Times

理解OpenGL是一个状态机

什么是状态机,简单的可以理解为:

  1. 它有记忆的能力,能够记住自己当前的状态。
  2. 它可以接收输入,根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出。
  3. 当它进入某个特殊的状态(停机状态)的时候,它不再接收输入,停止工作。

我们举个以电脑操作为例:

  1. 电脑的存储器(内存、硬盘等等),可以记住电脑自己当前的状态(当前安装在电脑中的软件、保存在电脑中的数据,其实都是二进制的值,都属于当前的状态)。
  2. 电脑的输入设备接收输入(键盘输入、鼠标输入、文件输入),根据输入的内容和自己的状态(主要指可以运行的程序代码),修改自己的状态(修改内存中的值),并且可以得到输出(将结果显示到屏幕)。
  3. 当它进入某个特殊的状态(关机状态)的时候,它不再接收输入,停止工作。

将OpenGL也看做这样一个机器,对照理解一下:

  1. OpenGL记录了初始化状态(比如颜色,纹理,等等设置)
  2. OpenGL接收了参数输入,则修改当前状态并输出(比如我们调用glColor3f,则OpenGL接收到这个输入后会修改自己的“当前颜色”这个状态;我们调用glRectf,则OpenGL会输出一个矩形)
  3. OpenGL可以进入停止状态,不再接收输入。

还没有理解??

我们实际写一个Demo, 对某个参数修改的时候,在下次渲染就会发生改变。

  • 可以使用glColor* 函数来选择一种颜色,以后绘制的所有物体都是这种颜色,除非再次使用glColor* 函数重新设定。
  • 可以使用glTexCoord* 函数来设置一个纹理坐标,以后绘制的所有物体都是采用这种纹理坐标,除非再次使用glTexCoord* 函数重新设置。
  • 可以使用glBlendFunc函数来指定混合功能的源因子和目标因子,以后绘制的所有物体都是采用这个源因子和目标因子,除非再次使用glBlendFunc函数重新指定。
  • 可以使用glLight* 函数来指定光源的位置、颜色,以后绘制的所有物体都是采用这个光源的位置、颜色,除非再次使用glBlendFunc函数重新指定。

总结什么是OpenGL的状态机:OpenGL保持自身的状态,除非用户输入一条命令让它改变状态。

OpenGL保存了自己的状态,我们可以通过一些函数来取得这些状态。
首先来说一些启用/禁用的状态,我们通过glEnable来启用状态,通过glDisable来禁用它们。例如:

glEnable(GL_DEPTH_TEST);  
glEnable(GL_BLEND);
glEnable(GL_CULL_FACE);
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);

可以用glIsEnabled函数来检测这些状态是否被开启。例如:

glIsEnabled(GL_DEPTH_TEST);  
glIsEnabled(GL_BLEND);
glIsEnabled(GL_CULL_FACE);
glIsEnabled(GL_LIGHTING);
glIsEnabled(GL_TEXTURE_2D);

如果状态是开启的,则glIsEnabled函数返回GL_TRUE(这是一个不为零的常量,一般被定义为1);否则返回GL_FALSE(这是一个常量,其值为零)
我们可以在程序里面写:

if( glIsEnabled(GL_BLEND) ) {  
     // 当前开启了混合功能
else {
     // 当前没有开启混合功能
}