如何将openGL版本降级到2.0以进行测试

时间:2016-04-29 08:06:24

标签: opengl opengl-es

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

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

3 个答案:

答案 0 :(得分:0)

使用GLEW检查您的GPU是否支持更新版本的OpenGL只需获取一个宏(I.E 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
};

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

答案 1 :(得分:0)

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

但是,可以使用OpenGL loading library,它支持仅公开所需API版本的功能。其中包括&#34; glLoadGen&#34; (我写的),&#34;很高兴&#34;和&#34; glbinding&#34;。您可以使用这些库来生成仅显示OpenGL 2.0内容的加载器。这样,即使您的实现支持更多,您也无法使用它。

答案 2 :(得分:0)

使用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类型。

enableProdMode()