我怎样才能找出两台机器不同的 OpenGL 扩展中哪些在第二台机器上丢失了?

我怎样才能找出两台机器不同的 OpenGL 扩展中哪些在第二台机器上丢失了?

我知道这个问题听起来有点傻,但我想知道是否有办法在不使用“暴力破解”的情况下做我假装的事情。

我正在开发一个使用一些 OpenGL 内容的大型应用程序,用于 GUI 目的。我一直在使用 OpenGL 的大量扩展。所有操作都是在具有良好图形卡的机器上完成的,因此一切始终运行良好。

现在我在一台显卡较弱的机器上测试了我的应用程序 - 第一台机器支持很多 opengl 4 功能,第二台机器只支持版本 3 中的几个功能 - 不幸的是,有几项功能没有显示出来。

我想说的原因是,不知何故,我正在使用一个在较弱的机器上不受支持的扩展,但我完全不知道哪个扩展或功能可能不受支持。

所以,问题是有什么方法可以找出是哪个扩展,例如,以某种方式禁用一个扩展,然后检查它是否仍在好机器上工作。我的问题是代码很大,以至于无法在好机器上逐行注释,直到我遇到同样的问题。

答案1

您可以使用调用枚举可用的 OpenGL 扩展

glGetString(GL_EXTENSIONS);

测试扩展尤其需要小心。此函数可在 OpenGL wiki 上找到:

// Helper to check for extension string presence.  Adapted from:
//   http://www.opengl.org/resources/features/OGLextensions/
static int isExtensionSupported(const char *extList, const char *extension)
{

  const char *start;
  const char *where, *terminator;

  /* Extension names should not have spaces. */
  where = strchr(extension, ' ');
  if ( where || *extension == '\0' )
    return 0;

  /* It takes a bit of care to be fool-proof about parsing the
     OpenGL extensions string. Don't be fooled by sub-strings,
     etc. */
  for ( start = extList; ; ) {
    where = strstr( start, extension );

    if ( !where )
      break;

    terminator = where + strlen( extension );

    if ( where == start || *(where - 1) == ' ' )
      if ( *terminator == ' ' || *terminator == '\0' )
        return 1;

    start = terminator;
  }

  return 0;
}

答案2

通常,您可以通过调用 OpenGL API 来获取扩展列表。例如,在 Linux 上使用glxinfo查看扩展列表。

相关内容