opengl - 什么是 "OpenGL State Machine"?

标签 opengl opengl-4

我的大脑倾向于以分层、面向对象、类似组件的方式来构建概念。不幸的是,这使我无法理解 OpenGL——我怀疑我困惑的根源在于我误解了“OpenGL 状态机”是什么。你得到了graphics pipeline ,但这确实是特定于绘制用户图形组件的单个程序对象,对吗?

  • 这个主状态机是什么?
  • 是 OpenGL api,还是我要绘制的帧,还是用户定义的东西——比如管道?
  • 它可以存在于哪些不同的状态?
  • 它也是事件驱动的吗?
  • 哪些输入会影响机器可能处于的不同状态?
  • 可以将分层的 OOP 概念应用于此状态机吗?
  • 最佳答案

    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/

    相关文章:

    c++ - 在函数周围调用std::thread()的工作方式不同

    opengl - 我可以将 OpenGL 版本限制为 4.3 吗?

    opengl - glGetTextureSubImage 无效操作

    opengl - GLSL 全局变量

    c++ - 在C++中删除数组导致程序崩溃

    c# - OpenGL 尝试绘制多个 2d 纹理,只出现第一个

    python - 如何在pygame和pyopengl中独立旋转2个对象

    opengl - Go go-gl OpenGL 渲染问题

    opengl - 使用 OpenGL 4.x 的 1d 纹理进行纹理映射

    c++ - OpenGL SuperBible 第 6 版,缺少头文件 sb6.h