是否可以在OpenGL中同时保留所有状态?

时间:2016-04-24 17:51:56

标签: opengl operating-system

如果我们有几个OpenGL上下文,每个都在自己的进程中,驱动程序会以某种方式虚拟设备,以便每个程序都认为它只运行GPU。也就是说,如果一个程序调用{​​{1}},另一个程序将永远不会注意到它。

这可以通过大量glEnable调用以保存状态及其对应物以便在之后恢复它来完成。显然,司机更有效率地做到了。但是,在用户空间中,我们需要跟踪我们对状态所做的更改并有选择地处理它们。也许这只是我遗漏了一些东西,但我认为为一个人调整一个帧缓冲区的视口会很好,然后将这些变化撤消到以前的状态。

也许有一种方法可以在一个程序中实现上下文切换的效果吗?

3 个答案:

答案 0 :(得分:1)

  

也许有一种方法可以在一个程序中实现上下文切换的效果吗?

您可以在一个进程中根据需要创建任意数量的OpenGL上下文,并在它们之间切换。此外,对于现代GPU,OpenGL上下文的状态与GPU上实际发生的情况几乎没有相似之处。

答案 1 :(得分:1)

对于预核心OpenGL,glPushAttrib()/glPopAttrib()可以让你存储一些GL状态。

你可能最好还是编写自己的客户端状态阴影。

答案 2 :(得分:1)

状态机(和命令队列,如下所述)对每个上下文都是唯一的。它比你想象的要高得多;状态通常很好地包含在用户模式中。

对于单个进程中的上下文切换,请注意GL中的每个渲染上下文都是不同步的。在上下文切换期间生成隐式刷新,以帮助缓解此问题。只要上下文仅由单个线程使用,这通常就足够了,但可能会对性能产生负面影响。