【问题标题】:Handling global variables when writing OpenGL with glut(or freeglut)使用 glut(或 freeglut)编写 OpenGL 时处理全局变量
【发布时间】:2012-04-18 08:34:38
【问题描述】:

我正在通过 glut 库学习 OpenGL。问题是当程序增长时,有很多global variables 需要处理。正如很多人所说,在程序中使用过多的global variables 是不妥的。但是,我不能通过将用户定义的参数传递给 glut 定义的回调函数来替代global variables。例如:

void display (void)
{
   // How to pass user defined parameters here?
   // some more code
}
int
main(void)
{
    glutDisplayFunc(display);
    // some more code
}

所以我的问题是这样的:

  1. 使用 glut 编写 OpenGL 时如何处理全局变量?
  2. 有没有其他方法可以替换全局变量而不是将参数传递给函数
  3. 其他处理 OpenGL 输入/输出的库(不是 glut)如何处理全局变量?

【问题讨论】:

    标签: opengl global-variables glut


    【解决方案1】:

    “没有全局变量”的规则是不完整的。实际的措辞是“没有全局变量在函数之间传递参数”。但是,全局变量可以很好地保持全局、程序范围的状态。

    用glut写OpenGL时如何处理全局变量?

    如果您管理的状态是程序状态,那么实际上全局变量就可以了。可以使用glutGet 检索窗口相关状态。不要忘记,OpenGL 本身就是一个大型的全局状态机。每个线程有一个全局 OpenGL 上下文,切换上下文实际上会更改一个全局变量。

    不要将 GLUT reshape 函数用于与渲染相关的事情,即不要在 reshape 中设置视口和投影。在显示功能中进行。

    有没有其他方法可以替换全局变量而不是将参数传递给函数

    有一些方法,例如使用 ffcall 库将参数化函数转换为可以传递给 GLUT 的闭包。

    其他处理 OpenGL 输入/输出的库(不是过剩)如何处理全局变量?

    要么允许将数据参数传递给回调函数(GLUT 中的重大设计失败,不允许这样做),要么使用基于消息/信号的系统而不是回调。

    【讨论】:

    • 实际上我必须在函数之间传递许多全局变量。例如,当我按下空格键时,它会更改定义为全局变量并在keyboard 回调函数中处理的stepsize 的值。 stepsize 需要传递给display 回调函数来改变查看器和对象之间的距离(例如)。另一个例子是,当我初始化纹理对象(在init() func 中)时,它们必须是全局的才能传递给display 函数。处理得对吗?还是有更好的解决方案?
    • @tlh1987:你的回调函数不应该将数据传递给显示,而是改变程序状态。根据定义,程序状态是全局的。您需要一种真正的函数式语言(如 Lisp、Scheme、OCaml 或 Haskell)来通过函数参数化有效地管理程序状态。但是 C 是必不可少的,对您而言,您将在某个地方拥有一些全局状态。
    • 嗯……其实我没看懂change the program state的意思,也不知道怎么改键盘回调函数里的program state。由于我之前处理全局变量 stepsize 的评论不是一个好主意,你能给我一个实用的解决方案吗?我只是浏览了关于OpenGL的红皮书,对函数式语言了解不多。
    • “程序状态”是一个术语,它涵盖了程序所拥有的所有数据以及它的功能在其上运行的数据。游戏的程序状态将是例如加载的地图、玩家位置和统计数据。在某些时候,您必须将它们保存在程序范围的变量中。如果您采用以文档为中心的方法,您将拥有一些主文档结构,其他所有内容都从该结构中分出。但是对于 GLUT-ish 程序,您没有多个文档或世界或类似的东西。因此,将状态放入全局变量中就可以了。对于任何复杂的事情,你都应该放弃 GLUT。
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 2011-01-10
    • 1970-01-01
    • 2012-05-09
    • 2020-04-19
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多