【问题标题】:Have OpenGL Render while cursor in GLUT UI在 GLUT UI 中的光标时进行 OpenGL 渲染
【发布时间】:2011-07-28 19:59:36
【问题描述】:

我有一个主窗口,它在屏幕顶部 10% 处有一个过剩 UI,在屏幕底部 90% 处有一个 openGL 世界。每次我的光标开始悬停在 GLUT 部分上时,openGL 渲染都会冻结。它仅在光标退出 GLUT 区域时恢复。

这是因为只要光标悬停在 GLUT 区域上,大概 glutIdleFunc 就不会被调用,因为 glut 不是“空闲”,所以 openGL 的东西不会被渲染。

我已经尝试创建一个新的不相关线程,它只调用显示代码和/或 glutPostRedisplay,但我得到了高达 20 fps 的帧速率,而不是正常方式的 100+ fps。我不知道具体为什么。 (在这个测试中我也禁用了 glutIdleFunc 所以没有空闲函数,只是调用显示的单独线程)

解决这个问题的方法(除了“停止使用过剩”,我将来可能会这样做,但现在我想要一个临时解决方案)?

【问题讨论】:

  • 您如何设置屏幕的这两个不同部分,以便实际上就 GLUT 而言它们是“分离的”?
  • GLUT 没有 用户界面。那么你是如何构建这个 UI 的呢?你在使用 GLUI(它使用 GLUT,但它本身不是 GLUT)?
  • 抱歉,我使用的是 GLUI,子窗口是使用 GLUI 创建的 *glui = GLUI_Master.create_glui_subwindow(main_window, GLUI_SUBWINDOW_TOP);

标签: opengl interface render glut


【解决方案1】:

我知道这是一个老问题,但我遇到了类似的问题,想分享一下我是如何解决的。

基本上,在您的空闲功能中,您应该手动将窗口设置为您的正常窗口 ID。感谢 Joel Davis 的 HexPlanet 代码 (https://github.com/joeld42/hexplanet/) 展示了这一点:

void glut_Idle( void )
{
  // According to the GLUT specification, the current window is 
  // undefined during an idle callback.  So we need to explicitly change
  // it if necessary
  if ( glutGetWindow() != g_glutMainWin ) 
  {
    glutSetWindow(g_glutMainWin);  
  }

  ...
}

【讨论】:

  • 为我工作!不知道为什么当鼠标悬停在 GLUI 上时我的 glutPostRedisplay 在 GLUI 回调中有效但在 onIdle 中无效,但这修复了它在我的 onIdle 中无效!
【解决方案2】:

为被动运动函数创建回调:

void passiveMouseFunc(int,int){
    glutPostRedisplay();
}

并使用以下方式注册:

glutPassiveMotionFunc(passiveMouseFunc);

【讨论】:

  • 不幸的是:1. 当用户的鼠标不移动时,这将不起作用 2. glut 似乎将屏幕的 ui 部分和 opengl 部分视为不同的窗口,因此 glutPostRedisplay 无论如何只会刷新 ui 部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多