gpt4 book ai didi

opengl - 击败状态机

转载 作者:行者123 更新时间:2023-12-02 01:52:46 25 4
gpt4 key购买 nike

我正在为一种允许用户访问 OpenGL 1.1 命令集的脚本语言开发插件。最重要的是,脚本语言自己的 gfx 命令集的所有功能都透明地重定向到适当的 OpenGL 调用。通常,用户应该使用 OpenGL 命令集 脚本语言的内置 gfx 命令集,它基本上只包含典型的 2D 绘图命令,如 DrawLine()DrawRectangle()DrawPolygon()

但是,在某些情况下,用户可能希望混合调用 OpenGL 内置的 gfx 命令集。这导致我的内置命令(如 DrawLine()DrawRectangle()DrawPolygon() 等)的 OpenGL 实现必须能够处理 OpenGL 状态机当前可能处于的任何状态。

因此,我的想法是首先将所有状态信息保存在堆栈中,然后准备一个干净的 OpenGL 上下文,以供我执行命令(如 DrawLine() 等)时使用.然后恢复原状。例如。像这样:

glPushAttrib(GL_ALL_ATTRIB_BITS);
glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS);
glPushMatrix();
....prepare OpenGL context for my needs.... --> problem: see below #2
....do drawing....
glPopMatrix();
glPopClientAttrib();
glPopAttrib();

然而,这样做会导致几个问题:

  1. glPushAttrib() 不会推送所有属性,例如保存像素打包和解包状态、渲染模式状态以及选择和反馈状态不会推送。此外,不保存扩展状态。扩展状态并不重要,因为我的插件不支持扩展。保存和恢复其他信息(像素打包和解包)可能可以使用 glGet() 手动实现。
  2. 大问题:保存所有状态信息后,我应该如何准备 OpenGL 上下文?我可以在 OpenGL 初始化后立即在堆栈上保存一个“干净”状态的副本,然后尝试弹出这个堆栈,但为此我需要一个函数来在堆栈中移动数据,即我需要一个函数来复制或者将已保存的状态从栈尾移到栈顶,以便我可以弹出它。但是我没有看到一个函数可以完成这个...
  3. 它可能会非常慢,但这是我可以忍受的,因为用户不应该混合使用 OpenGL 和内置 gfx 调用。如果他仍然这样做,他将不得不忍受非常糟糕的表现。

在这些介绍性考虑之后,我终于想提出我的问题:是否有可能以某种方式“打败”OpenGL 状态机? “跳动”我的意思是:是否可以完全保存所有当前状态信息,然后恢复默认状态并为我的需要做准备并进行绘图,然后最后再次恢复完整的先前状态以便一切都完全一样和以前一样。例如,脚本语言的 DrawLine() 命令的基于 OpenGL 的版本将执行如下操作:

1. Save all current state information
2. Restore default state, set up a 2D projection matrix
3. Draw the line
4. Restore all saved state information so that the state is exactly the same as before

这有可能吗?只要能 100% 保证将状态放入与之前完全相同的状态,即使它很慢也没关系。

最佳答案

您可以简单地使用不同的上下文,尤其是在您不关心性能的情况下。只需为您的内部 gfx 操作和另一个用户可能会弄​​乱的操作保留一个上下文,然后将适当的一个绑定(bind)到您的窗口(和线程)。

你描述它的方式看起来你永远不想与用户的 GL 东西共享对象,所以简单的“非共享”上下文就可以了。您似乎想要共享的只是帧缓冲区——而 GL 帧缓冲区(包括前后颜色缓冲区、深度缓冲区、模板等)是可绘制对象/窗口的一部分,而不是上下文——因此您可以访问它当您使上下文成为当前上下文时,任何上下文。在中帧更改上下文不是问题。

关于opengl - 击败状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21810259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com