我的大脑倾向于以分层、面向对象、类似组件的方式来构建概念。不幸的是,这使我无法理解 OpenGL——我怀疑我困惑的根源在于我误解了“OpenGL 状态机”是什么。你得到了graphics pipeline ,但这确实是特定于绘制用户图形组件的单个程序对象,对吗?
最佳答案
What is this state machine?
想象一个带有几十个开关拨盘的总机。该配电盘连接到加工厂中的机器,根据开关的切换方式,从一侧进入加工厂的东西将沿特定路径穿过工厂。改变其中一些开关的状态,事情就会走向另一条路。
还有状态机,当东西经过某个处理步骤时,开关和刻度盘会发生变化; OpenGL 不是那种。
OpenGL 上下文就是这样一个交换机,后面有一个加工厂。总机是你通过 API 控制的东西,加工厂是制作图片的东西。
What are the different states it can exist in?
太多了,就不一一列举了。对于每个开关,状态数乘以开关可以处于的位置数。假设您有 20 个拨动开关,一个拨盘有 5 个位置,一个拨盘有 7 个位置,那么您有
2^20 * 5 * 7 = 36700160
可能的不同状态。某些版本的 OpenGL 有超过 300 个状态变量,其中许多不仅仅是 bool 值。因此,试图列出每一个可能的状态是徒劳的。Is it also event-driven?
不!
What inputs affect the different states the machine can be in?
OpenGL API的状态改变函数的显式调用;那和默认的初始状态。
Can hierarchical, OOP concepts be applied to this state machine?
不。或者更确切地说,您可以尝试,但说实话,唯一真实的表示将是单个 OpenGL 上下文类持有所有状态的表示。
在 OpenGL 上下文中有一些东西,它们的行为就像具有自己状态的单个对象。例如纹理,但是这些对象与 OpenGL 上下文本身密切相关,不能独立查看。
关于您的评论的个人说明
My brain tends to favor structuring concepts in hierarchical, object-oriented, component-like ways.
别那样做!计算机不是那样工作的。 OOP 是一种构建项目的方法,但它不是一个很好的工具来理解一些预先存在的系统。尤其是本质上非分层的系统。
我强烈建议您通过学习其他构建项目的方法来扩展您的视野。学习函数式编程怎么样? Haskell 将成为目前流行的 FP 语言之一,并且由于它专注于成为一种纯语言,因此它的学习体验非常好。这是一本非常好的在线书籍/教程:http://learnyouahaskell.com/chapters – 准备好让你的头脑弯曲;有些事情看起来像是 OOP,但实际上不是;靠着这些墙壁奔跑可能看起来令人沮丧,但是当它最终在您的脑海中单击并且“您明白了”(=顿悟)时,它的好处确实值得。
请注意,OpenGL 既不是功能性的,也不是真正的 OOP。而且由于不是函数式的,它不能很好地映射到纯函数式编程中。 Haskell 有 OpenGL 绑定(bind),但它们是通过称为“monad”的东西实现的; monads 是函数式程序用来联系状态甚至驱动环境的工具。
我推荐的另一个资源是https://mitpress.mit.edu/sicp/full-text/book/book.html – 每个程序员都应该读过它。
关于opengl - 什么是 "OpenGL State Machine"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31282678/