【问题标题】:illegal glutInit() reinitialization attempt: How can I de-initialize glut?非法 glutInit() 重新初始化尝试:如何取消初始化 glut?
【发布时间】:2021-10-03 03:30:36
【问题描述】:

我实现了一个类函数,如果类被激活,则调用glutInit()。像这样:

void myViewer::Activate() {
  int argc = 1;
  char* argv[1] = {const_cast<char*>("none")};
  glutInit(&argc, argv);
}
void myViewer::Deactivate() {
  ...
}

如何“取消初始化” Glut 组件?两次调用激活函数会报错freeglut (none): illegal glutInit() reinitialization attempt

【问题讨论】:

  • 为什么要将"none"const char* 转换为char*
  • 我是 freeglut 的新手,初始化代码不是来自我。好像处理了glutInit的说法void glutInit(int *argcp, char **argv)有什么更好的实现方式?

标签: c++ glut freeglut


【解决方案1】:

文档的Initialization 部分明确指出:

主要的初始化例程是glutInit,应该只是 在 GLUT 程序中只调用一次

您也没有将glutInit 用作specified。试图提供虚假的论点是自找麻烦。他们想要原版(argcargv)是有原因的:

glutInit 将初始化 GLUT 库并与窗口系统协商会话

现在出于技术原因,即时关闭 OpenGL 会话并不是一项简单的任务。在尝试释放与操作系统协商的显示表面之前,需要仔细彻底地关闭所有 OpenGL 活动。

许多视频游戏甚至都没有尝试这样做。他们只需抓住一个窗口进行显示并运行直到游戏终止(一种或另一种方式:))。

事实上,过剩明确禁止你尝试。

【讨论】:

  • 感谢黑井的解释!你的意思是,我必须将主函数中的argcargv 传递给glutInit()?问题是我尝试创建一个 GUI 应用程序的模块化和动态类,它可以由用户关闭和打开。
  • 唉,你不能。 glut 并不是为了这个,它只是一个轻量级的库,可以简化 OpenGL 访问。你不能打开和关闭它。您初始化它以从底层操作系统获取渲染表面,执行 OpenGL 操作,完成后终止程序。这就是过剩所允许的。
猜你喜欢
  • 2020-10-25
  • 1970-01-01
  • 2012-02-15
  • 2015-02-17
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多