如何检查OpenGL版本的一致性?

时间:2014-09-13 20:23:45

标签: c++ opengl version

我想确保我的应用程序符合OpenGL 2.1。 我怎么检查这个?

因为我的电脑支持GL4.4,即使我使用glGenVertexArrays(),它也能成功运行。但glGenVertexArrays()仅适用于GL3 +。

所以,我想验证我的应用程序仅使用GL2.1功能。 一种方法是在我只支持GL2.1的旧PC上运行它,但我正在寻找一种更简单的方法。

3 个答案:

答案 0 :(得分:2)

如果您发现支持生成版本特定标头的扩展加载程序,如@datenwolf所述,这可能是您最简单的解决方案。如有必要,您可以尝试其他选项。

您可以在https://www.opengl.org/registry找到的官方OpenGL标头包含按版本分组的定义,并包含在预处理器条件中。布局如下所示:

...
#ifndef GL_VERSION_2_1
#define GL_VERSION_2_1 1
// GL 2.1 definitions
#endif
#ifndef GL_VERSION_3_0
#define GL_VERSION_3_0 1
// GL 3.0 definitions
#endif
#ifndef GL_VERSION_3_1
#define GL_VERSION_3_1 1
// GL 3.1 definitions
#endif
...

您应该能够至少在版本测试中包含官方标题。如果通过定义相应的预处理器符号来禁用您不想使用的版本,则在尝试使用这些版本的功能时,将出现编译错误。例如,对于GL 2.1:

#define GL_VERSION_3_0 1
#define GL_VERSION_3_1 1
#define GL_VERSION_3_2 1
#define GL_VERSION_3_3 1
#define GL_VERSION_4_0 1
#define GL_VERSION_4_1 1
#define GL_VERSION_4_2 1
#define GL_VERSION_4_3 1
#define GL_VERSION_4_4 1
#define GL_VERSION_4_5 1
#include <GL/glext.h>

// your code

答案 1 :(得分:1)

您可以在只有OpenGL-2.1符号可用的环境中编译它。根据您使用的扩展包装器/加载器,这可能很容易或很难。

例如,如果您使用glloadgen OpenGL loader generator,则可以生成一个头文件和编译单元,它将仅涵盖OpenGL-2.1符号和标记。如果您使用此编译项目,则编译器将对未涵盖的任何内容进行错误处理。

答案 2 :(得分:1)

试试https://github.com/cginternals/glbinding。它是一个OpenGL包装器库,它完全支持您的要求:

  

以功能为中心的标题设计

     

OpenGL API以版本的形式迭代开发和发布,   内部(用于API规范)名为 features 。最新的   OpenGL的功能/版本是4.5。以前的版本是1.0,1.1,   1.2,1.3,1.4,1.5,2.0,2.1,3.0,3.1,3.2,3.3,4.0,4.1,4.2,4.3和4.4。 OpenGL使用弃用模型来删除过时的部件   其API导致兼容性(已弃用的API)和   核心(没有弃用的API)用法,表现在目标中   OpenGL上下文。最重要的是,建议使用新的API概念   可能集成到的扩展(通常是特定于供应商的)   未来的版本。所有这些导致许多可能的具体   您可以在程序中使用的OpenGL API的表现形式。

     

一项艰巨的任务是坚持自己的一套商定的功能   OpenGL程序(例如,OpenGL 3.2 Core,如果你想为每一个开发   过去4年发布的Windows,macOS和Linux)。 glbinding   通过提供每个功能标头来促进这一点   定义/生成的OpenGL API子集。

     

所有功能OpenGL标题

     

如果不使用每个功能标题,OpenGL程序可能看起来像   这样:

#include <glbinding/gl/gl.h>

// draw code
gl::glClear(gl::GL_COLOR_BUFFER_BIT | gl::GL_DEPTH_BUFFER_BIT);
gl::glUniform1i(u_numcubes, m_numcubes);
gl::glDrawElementsInstanced(gl::GL_TRIANGLES, 18, gl::GL_UNSIGNED_BYTE, 0, m_numcubes * m_numcubes);
     

单功能OpenGL标题

     

在安装了最新驱动程序的Windows上开发代码时,   上面的代码可能会编译运行。但是如果你想要移植   它适用于驱动程序支持较不成熟的系统(例如,macOS或Linux)   使用开源驱动程序),您可能想知道glDrawElementsInstanced   是可用的。在这种情况下,只需切换到每个功能标头    glbinding 并选择OpenGL 3.2 Core标头(如您所知)   至少此版本适用于所有目标平台):

#include <glbinding/gl32core/gl.h>

// draw code
gl32core::glClear(gl32core::GL_COLOR_BUFFER_BIT | gl32core::GL_DEPTH_BUFFER_BIT);
gl32core::glUniform1i(u_numcubes, m_numcubes);
gl32core::glDrawElementsInstanced(gl32core::GL_TRIANGLES, 18, gl32core::GL_UNSIGNED_BYTE, 0, m_numcubes * m_numcubes);
     

如果代码编译比你可以确定它是OpenGL 3.2 Core   兼容。使用尚不可用或依赖的功能   不推荐使用已弃用的功能。