OpenGL上下文
- OpenGL本身就是一个
非常庞大的状态机(State Machine)
,其状态通常被称为OpenGL上下文(Context)。它里面保存了一系列的变量用来描述OpenGL此刻需要如何运行,比如拍照时候要开启滤镜功能等等。- OpenGL使用C语言编写的,进而他的Api的封装也都是面向过程的,其
函数本质上都是对OpenGL上下文状态机中的某个状态或者对象进行操作
。- 应用程序中可以创建多个
不同的上下文
,他们分别在各自的线程中使用
。上下文之间共享纹理
,缓冲区等资源
,采用这中方案更为高效,因为它避免了反复切换上下文,或者大量修改渲染状态所造成的较大的开销。
OpenGL状态机
状态机是理论上的一种机器,我是结合自己的工作经历
去理解这个概念(括号里面的内容
)。
什么是状态机
- 状态机描述了一个对象(我)在其生命周期(事业发展)内所经历的各种状态(公司/行业),状态间的转变(跳槽/创业),发生转变的动因(离职/转行的原因),条件及转变中所执行的活动(关系网建立+学习+面试)。
- 状态机是一种行为,说明对象在其生命周期中响应事件所经历的状态序列以及对那些状态事件的响应(个人简历中体现事业发展线,和对于行业变革做出的相应)。
状态机的特点有哪些
- 它有
记忆功能
:能够记住自己当前的状态。- 它可以
接收输入
:根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出。- 当它进入某个特殊的状态如停机状态的时候,它不再接收输入,停止工作。
和足球停球
有点类似?!
O(∩_∩)O哈哈~ 试着理解下~
就像是足球运动员在场上奔跑时接收到了队友的传球时,他会根据自己当前的位置(记忆功能
)以及足球过来的角度和力量(接收输入
),做出相应动作的调整(修改自己的状态
),然后将球停在自己脚下(得到输出
)。最后当比赛结束或其他原因至运动员下场了便不再响应这件事(不再接收输入
)。
类推到OpenGL中的状态机
- 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在接收我们的输入),根据输入的内容和自己的状态,修改自己的状态,并且可以得到输出(比如我们调用glColor3f,则OpenGL接收到这个输入后会修改自己的“当前颜色”这个状态;我们调用glRectf,则OpenGL会输出一个矩形)
- OpenGL可以进入停止状态,不再接收输入。这个可能在我们的程序中表现得不太明显,不过在程序退出前,OpenGL总会先停止工作的。
总的来讲,“状态机”可以简化这个描述:
OpenGL是一个状态机,它保持自身的状态,除非用户输入一条命令让它改变状态。
颜色、纹理坐标、源因子和目标因子、光源的各种参数,等等,这些都是状态,所以这一句话就包含了上面叙述的所有内容。
此外,“是否启用了光照”、“是否启用了纹理”、“是否启用了混合”、“是否启用了深度测试”等等,这些也都是状态,也符合上面的描述:OpenGL会保持状态,除非我们调用OpenGL函数来改变它。
网友评论