OpenGL-上下文和状态机

2019-05-12  本文已影响0人  Tobesky

OpenGL上下文

  • OpenGL本身就是一个非常庞大的状态机(State Machine) ,其状态通常被称为OpenGL上下文(Context)。它里面保存了一系列的变量用来描述OpenGL此刻需要如何运行,比如拍照时候要开启滤镜功能等等。
  • OpenGL使用C语言编写的,进而他的Api的封装也都是面向过程的,其函数本质上都是对OpenGL上下文状态机中的某个状态或者对象进行操作
  • 应用程序中可以创建多个不同的上下文,他们分别在各自的线程中使用。上下文之间共享纹理缓冲区等资源,采用这中方案更为高效,因为它避免了反复切换上下文,或者大量修改渲染状态所造成的较大的开销。

OpenGL状态机

状态机是理论上的一种机器,我是结合自己的工作经历去理解这个概念(括号里面的内容)。

什么是状态机

  • 状态机描述了一个对象(我)在其生命周期(事业发展)内所经历的各种状态(公司/行业),状态间的转变(跳槽/创业),发生转变的动因(离职/转行的原因),条件及转变中所执行的活动(关系网建立+学习+面试)。
  • 状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列以及对那些状态事件的响应(个人简历中体现事业发展线,和对于行业变革做出的相应)。

状态机的特点有哪些

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

足球停球有点类似?!
O(∩_∩)O哈哈~ 试着理解下~

就像是足球运动员在场上奔跑时接收到了队友的传球时,他会根据自己当前的位置(记忆功能)以及足球过来的角度和力量(接收输入),做出相应动作的调整(修改自己的状态),然后将球停在自己脚下(得到输出)。最后当比赛结束或其他原因至运动员下场了便不再响应这件事(不再接收输入)。

类推到OpenGL中的状态机

glClearColor(1.0,1.0,1.0.1.0);

glEnable(GL_DEPTH_TEST);//开启深度测试
glDisable(GL_DEPTH_TEST);//关闭深度测试

glEnable(GL_BLEND);//开启混合
glDisable(GL_BLEND)//关闭混合

总的来讲,“状态机”可以简化这个描述:OpenGL是一个状态机,它保持自身的状态,除非用户输入一条命令让它改变状态。

颜色、纹理坐标、源因子和目标因子、光源的各种参数,等等,这些都是状态,所以这一句话就包含了上面叙述的所有内容。
此外,“是否启用了光照”、“是否启用了纹理”、“是否启用了混合”、“是否启用了深度测试”等等,这些也都是状态,也符合上面的描述:OpenGL会保持状态,除非我们调用OpenGL函数来改变它。

上一篇 下一篇

猜你喜欢

热点阅读