我的大脑倾向于支持以层次化,面向对象,类似组件的方式构建概念.不幸的是,这使我无法理解OpenGL - 我怀疑我的困惑的根源在于我对"OpenGL状态机"的误解.你有图形管道,但这对于绘制用户图形组件的各个程序对象来说非常具体,对吧?
dat*_*olf 12
什么是这台状态机?
想象一下配有几十个交换机拨号的交换机.该配电板连接到加工厂中的机器,并且根据开关的切换方式,在一侧进入加工厂的物料将以特定路径穿过工厂.改变其中一些开关的状态,事情将采取另一种方式.
还有状态机,当物料经过某个处理步骤时,开关和拨号盘会被改变; OpenGL不是那种.
OpenGL上下文就是这样一个交换机,后面有一个处理工厂.交换机是您通过API控制的,处理工厂是制作图片的原因.
它可以存在的不同状态是什么?
列出太多了.对于每个开关,状态数乘以开关所在位置的数量.假设您有20个拨动开关,一个带5个位置的拨盘和一个带7个位置的拨盘,那么您2^20 * 5 * 7 = 36700160可能有不同的状态.某些版本的OpenGL有超过300个状态变量,其中许多不仅仅是布尔值.因此,尝试列出每个可能的状态是徒劳的努力.
它也是事件驱动的吗?
没有!
哪些输入会影响机器可以处于的不同状态?
显式调用OpenGL API的状态更改函数; 那个和默认的初始状态.
可以将分层的OOP概念应用于此状态机吗?
不.或者更确切地说,你可以尝试,但事实是,只有一个OpenGL上下文类保存所有状态才能真实表示.
OpenGL上下文中有一些东西,它们表现得像具有自己状态的单个对象.例如纹理,但是这些对象与OpenGL上下文本身密切相关,不能单独查看.
关于你的评论的个人说明
我的大脑倾向于支持以层次化,面向对象,类似组件的方式构建概念.
别那样做!计算机不能那样工作.OOP是一种构建项目的方法,但它不是理解某些预先存在的系统的非常好的工具.特别是非本机的系统.
我强烈建议您通过学习构建项目的其他方法来拓展视野.学习函数式编程怎么样?Haskell现在是流行的FP语言之一,由于其专注于纯语言,因此学习体验非常好.这是一本非常好的在线书籍/教程:http://learnyouahaskell.com/chapters-准备好让自己的思想开始; 有些东西可能看起来像是OOP,但它们不是; 在这些墙上奔跑可能看起来很令人沮丧,但是当它最终点击你的头并且"你得到它"(=有顿悟)的好处是值得的.
请注意,OpenGL既不是功能也不是真正的OOP.由于没有功能,它不能很好地映射到纯函数式编程.Haskell有OpenGL绑定,但它们是通过称为"monad"的东西实现的; 单子是什么功能的程序使用符合国家规定取得联系或事件驱动的环境.
我建议的另一个资源是https://mitpress.mit.edu/sicp/full-text/book/book.html - 那里的每个程序员都应该阅读它.
这是一个非常广泛的问题,所以我只是给你概述。
状态机是完整的 OpenGL API 和当前选择的渲染上下文的组合。渲染上下文包含构成状态机的所有状态,而 OpenGL API 提供更改这些状态的输入。
太多了,无法一一列举。例如,由glEnable和切换的功能glDisable(例如GL_TEXTURE_2D,GL_FOG,GL_BLEND)是状态的一部分。当前纹理的名称设置为glBindTexture;当前着色器程序的名称来自glUseProgram;模型视图和投影矩阵的内容以及它的状态glMatrixMode告诉任何glMultMatrix(等)调用将影响哪个矩阵;等等,都是国家的一部分
机器的初始状态由 OpenGL 规范给出,以 GPU 驱动程序为模。可以将机器置于不同状态的唯一输入是对 OpenGL API 的调用。
这个问题很模糊。什么是“分层的 OOP 概念”?
可以采用面向对象的方法来包装 OpenGL API。您可以创建一个“Texture”对象类,glGenTextures在初始化时使用它分配一个纹理名称,并提供上传纹理图像或更改纹理参数glBindTexture的方法,这些方法总是在调用这些方法的相关 API 之前调用。这种方法通常很棘手,因为您仍然必须通过对象和子对象方法调用来跟踪当前状态。
OpenGL 提供了几个“堆栈”(vis. glPushMatrix, glPushAttrib),旨在帮助管理对象的层次结构。通过将当前状态的某些部分压入堆栈,调用子对象的方法,然后将该状态从堆栈中弹出,您可以将状态恢复到父对象所期望的状态。
使用 OpenGL API 的一般面向对象方法是通过场景图 - 一个有向的、非循环的对象图,其中每个对象代表状态机状态的一些变化。对象推送到一个或多个 OpenGL 堆栈,使用 OpenGL API 调用应用其状态,调用其子对象的方法,然后从这些 OpenGL 堆栈中弹出以恢复先前的状态。
| 归档时间: |
|
| 查看次数: |
4680 次 |
| 最近记录: |