3

我制作了一个简单的 OpenGL 应用程序(链接)。在那里你可以看到它应该是什么样子的图像 - 以及它在我的计算机(OSX)上的外观:

正确的

问题是:当我的客户在他的计算机(Ubuntu)上克隆并编译它时,他看到的是:

错误 http://dl.dropboxusercontent.com/u/62862049/Screenshots/wl.png

我真的很困惑。如果我可以重现该错误,这将没有问题,但不能这样做使我对如何开始修复它一无所知。我该如何解决这个问题?

4

4 回答 4

5

我该如何解决这个问题?

我建议使用VirtualBox在你的机器上创建一个虚拟的 Ubuntu 环境,这样你就可以自己编译和调试问题。

如果它在您的虚拟机上按预期运行,那么问题可能与您客户端的驱动程序相关。

于 2013-09-27T10:05:47.137 回答
1

如果您不想遵循此建议并使用 virtualbox,其他选择是获得与您的客户端相同的设置(至少相似的硬件,相同的操作系统和安装包)。这样,它可能更容易重现和调试。

有时,由于驱动程序问题,应用程序在不同 GPU 上的行为会有所不同。驱动程序是否是最新的并不重要。

于 2013-09-27T10:41:58.307 回答
1

我遇到的一些奇怪的问题源于某处未初始化的数据。Valgrind 是寻找此类问题的天赐之物。Valkyrie 是一个很好的应用程序来组织它的输出。

在这种特定情况下,我将抛出一个疯狂的猜测。当窗口管理器发送延迟的调整大小事件或没有初始调整大小事件时,我已经看到这种情况发生。例如,如果您的代码希望在第一次绘制调用之前发送调整大小事件(或者每当您存储用于设置视口和纵横比的初始窗口大小时)并且该事件不会立即发生,那么您就错了价值观。如果在进入主循环之前没有发生真正的调整大小事件,我的 GL 框架会在内部注入一个调整大小事件(如果你想在它最终出现时忽略真正的调整大小事件,那就太麻烦了)。

于 2013-09-27T14:38:57.063 回答
1

我冒昧地纠正了我认为是让这段代码以可预测的方式运行的巨大障碍。gluPerspective (...)应该用于设置投影矩阵,有时您可以将所有内容都塞进一个矩阵中,但这并没有多大意义。

void GLWidget::paintGL(){
  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

  /* Original code that does really bad things ... 
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluPerspective(60.0f,(GLfloat)width/(GLfloat)height,0.01f,650.0f);
  */

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(60.0f,(GLfloat)width/(GLfloat)height,0.01f,650.0f);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(0.0, cam_radius, cam_radius,
            0.0, 0.0, 0.0,
            0.0, 0.0, 1.0);
  glViewport(0, 0, width, height);
  glRotatef( rotate_x, 1.0, 0.0, 0.0 );
  glRotatef( rotate_y, 0.0, 0.0, 1.0 );

  ...

}

至于调试您无法重现的东西,第一步是考虑可能产生类似于您(或者更确切地说,其他人)正在经历的效果的每个状态。这就是我在 StackOverflow 上大部分时间都在做的事情,当有人展示随机的代码和屏幕截图时。通常他们最初提供的代码是无用的,但问题的截图和描述会导致正确的解决方案;值得庆幸的是,评论部分允许我们在提交答案之前询问更具体的代码。

当我听到您的问题时,我首先想到的是投影和视口映射,这使qglwidget.cpp我发现了一些顽皮的代码。它可能不一定是你的全部问题,但它绝对是一个符合所有标准的问题。

于 2013-09-28T02:31:18.257 回答