【问题标题】:how to downgrade the openGL version up to 2.0 for testing purpose如何将openGL版本降级到2.0以进行测试
【发布时间】:2016-04-29 08:06:23
【问题描述】:

我正在尝试创建一个与 opengl 2.0 版和 opengl 3.2 版(核心配置文件)兼容的软件。我正在使用 glew 来创建我的上下文。我提供了一个编译时宏来指定 openGl 版本,并且我想在支持的最大 openGL 版本为 2.0 并且人们选择 3.2 时测试场景。我的电脑支持最高 4.5 的 openGL 版本,所以我无法测试这个场景。我想将支持的 openGL 版本降级到 2.0,以便我可以测试这个场景。一种方法是使用支持最大 openGL 版本 2.0 的旧 glew 版本,因此 glewIsSupported 功能对于版本 > 2.0 将失败,但我不想更改我的 glew 库,因为当机器真的只支持 openGL 时,这不是场景的正确复制2.0。

所以我的问题是如何降级我的计算机以支持最高 2.0 的 openGL 版本?我希望对 3.2 版本支持的 glew 检查失败,所以我可以显示错误消息并停止。

【问题讨论】:

  • 您要检查什么样的错误?您是否正在尝试查看您是否使用了更高版本的 OpenGL 版本的东西?另外,为什么是 GL 2.0 而不是 2.1?真的有那么多实现 2.0 而不是 2.1 的 OpenGL 实现吗?这与您将问题标记为 ES 的事实有关吗?
  • 使用 opengl 2.0 时,我没有使用 VAO,而使用 opengl 3.2 时,我使用的是 VAO。这是代码的主要区别。我需要测试这个场景,如果机器只支持 2.0 并且用户选择 3.2,我的应用程序会给出适当的错误并优雅地退出。它不应该给出意外的结果并检查我是否需要添加一些测试用例。所以我需要这样做。除了降级驱动版本还有什么办法吗?是的,我也支持 opengl es 2.0 和 opengl es 3.0。所以也将其标记为 es

标签: opengl opengl-es


【解决方案1】:

使用 GLEW 检查您的 GPU 是否支持较新版本的 OpenGL 只是获取一个宏(即 GLEW_VERSION_4_1)

所以有人可能有类似的东西 if(!GLEW_VERSION_4_0) 来测试兼容性,您可以使用自己的 bool 值来模拟这些宏,但允许您“假装”您的 GPU 不支持较新版本。

理论上,如果您想在有人不满足 OpenGL 3.2 支持的要求时测试您的功能,您可以简单地将查询支持版本的位置替换为 true 所以

bool supportOGL3_2 = true;
if(true) //if(!GLEW_VERSION_4_0) replacing this to check that this performs right when unsupported
{
    //Whatever your action is when min req. not met (message box and close application? revert to OpenGL2.0 functionality?)
supportOGL3_2 = false;
    //Example
    AfxMessageBox(_T("GL 4.0 Context not possible. This program requires a newer version of OpenGL. (GL 2.1 and before incompatible). \nPlease check that your GPU supports 4.0 and has an up-to-date driver installed."));
    //Quit app ? then uncomment below
    //ASSERT(AfxGetApp()->m_pMainWnd != NULL);
    //AfxGetApp()->m_pMainWnd->SendMessage(WM_CLOSE);
}

因此,如果您想恢复使用 OpenGL2.0 功能和固定功能管道,您可以在此处进行切换,例如:

//Setup request for OpenGL 4.0 Compatability Profile. Once old Gl is remove, switch this to the first commented line
int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB,   (supportOGL3_2) ? 3 : 2,
    WGL_CONTEXT_MINOR_VERSION_ARB,   (supportOGL3_2) ? 2 : 0,
    //WGL_CONTEXT_PROFILE_MASK_ARB,  WGL_CONTEXT_CORE_PROFILE_BIT_ARB, 
    WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
    0, 0  //End
};

如果您尝试检查错误消息的显示或某些捕获功能,这当然可以达到目的,但是如果您想实际查看绝对 无法 支持 GL2.0 以上但选择 GL3.2 配置文件;你为什么要允许这个功能?允许具有低于最低要求兼容性的系统尝试运行您的程序是一种危险的做法。最安全的选择是警告应用程序需要支持 GL3.2 的硬件,或者将您的程序恢复为使用传统的 OpenGL 功能。如果您选择执行后者,您只需在上面的示例代码中使该条件为真以达到该条件,然后确保在创建时请求较旧的 OpenGL 上下文。不需要任何花哨的东西来模仿这一点,而且您不需要做任何事情来强制您的 GPU 不支持更多最新的 OpenGL 版本。

【讨论】:

  • 我想要的是检查 GPU 是否支持 3.2 应该失败。所以我会给出一个错误信息并停止。我需要检查这种情况,因为我拥有的所有机器都支持 4.5 并且 glew 永远不会失败。我想降级 openGL 版本,以便 3.2 版本的 glew 检查将失败。我希望我说得更清楚。
  • 我明白了。但是,除了降级您的驱动程序之外,我不确定您是否可以强制您的 GPU 不支持低于出厂版本驱动程序所支持的任何值。但正如我之前所说,如果您只是想在只有较旧的 OpenGL 可用时检查您的功能,您可以使用 if(true) 代替您当前的 glew 版本检查来模拟这一点,类似于我在第一个代码中描述的部分。我自己在支持 4.0 的 GPU 和不支持 4.0 的 GPU 上对此进行了测试,使用 GLEW_VERSION 宏为我提供了预期的结果
  • 但如果您只有 GPU 支持 4.5,则需要使用临时 if 语句检查。
  • @PankajBansal 实际上,如果您的任何 GPU 在发布时仅支持 4.5 之前的版本,您可以确认版本检查是否正常工作。然后,您可以回滚您的驱动程序(因此不支持版本 4.5,仅支持 GPU 启动时支持的任何版本)并使用 GLEW_VERSION_4_5 测试捕获。我知道这不会测试您想要的版本,但它可以证明 GLEW 正确地捕获了版本。
  • 使用 opengl 2.0 时,我没有使用 VAO,而使用 opengl 3.2 时,我使用的是 VAO。这是代码的主要区别。我需要测试这个场景,如果机器只支持 2.0 并且用户选择 3.2,我的应用程序会给出适当的错误并优雅地退出。它不应该给出意外的结果并检查我是否需要添加一些测试用例。所以我需要这样做。除了降级驱动版本还有什么办法吗?
【解决方案2】:

您不能强制降级 OpenGL 功能。如果您要求 2.0 上下文,则允许实现为您提供 4.5 兼容性。

但是,您可以使用OpenGL loading library,它支持仅公开您想要的 API 版本的能力。其中包括“glLoadGen”(我写的)、“glad”和“glbinding”。您可以使用这些库来生成仅公开 OpenGL 2.0 内容的加载程序。这样,即使您的实现支持更多,您也不能使用它。

【讨论】:

    【解决方案3】:

    使用Mesa 并通过MESA_EXTENSION_MAX_YEAR and MESA_GL_VERSION_OVERRIDE 发挥创意:

    MESA_EXTENSION_MAX_YEAR - Mesa 返回的 GL_EXTENSIONS 字符串按延期年份排序。如果此变量设置为 X 年,则只会报告 X 年或之前定义的扩展。这是为了解决某些游戏中的一个错误,即扩展字符串被复制到固定大小的缓冲区中而不被截断。如果扩展字符串太长,缓冲区溢出会导致游戏崩溃。这是一个解决方法。

    MESA_GL_VERSION_OVERRIDE - 更改返回的值 glGetString(GL_VERSION) 和可能的 GL API 类型。

    The format should be MAJOR.MINOR[FC]
    FC is an optional suffix that indicates a forward compatible context. This is only valid for versions >= 3.0.
    GL versions < 3.0 are set to a compatibility (non-Core) profile
    GL versions = 3.0, see below
    GL versions > 3.0 are set to a Core profile
    Examples: 2.1, 3.0, 3.0FC, 3.1, 3.1FC
        2.1 - select a compatibility (non-Core) profile with GL version 2.1
        3.0 - select a compatibility (non-Core) profile with GL version 3.0
        3.0FC - select a Core+Forward Compatible profile with GL version 3.0
        3.1 - select a Core profile with GL version 3.1
        3.1FC - select a Core+Forward Compatible profile with GL version 3.1 
    Mesa may not really implement all the features of the given version. (for developers only)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-23
      • 2021-11-27
      • 2013-05-10
      • 2017-10-24
      • 2018-03-07
      • 1970-01-01
      • 2015-12-19
      相关资源
      最近更新 更多