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

C++ 如何检查OpenGL版本的一致性?,c++,opengl,version,C++,Opengl,Version,我想确保我的应用程序符合OpenGL 2.1。 我怎么检查这个 因为我的计算机支持GL4.4,所以即使我使用了,例如,glgenvertexarray(),它也能成功工作。但是glgenvertexarray()仅适用于GL3+ 因此,我想验证我的应用程序是否只使用GL2.1功能。 一种方法是在只支持GL2.1的旧PC上运行它,但我正在寻找一种更简单的方法。您可以在只有OpenGL-2.1符号可用的环境中编译它。这取决于您使用的扩展包装器/加载程序,可以是简单的,也可以是困难的 例如,如果使用,

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

因为我的计算机支持GL4.4,所以即使我使用了,例如,
glgenvertexarray()
,它也能成功工作。但是
glgenvertexarray()
仅适用于GL3+

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

您可以在只有OpenGL-2.1符号可用的环境中编译它。这取决于您使用的扩展包装器/加载程序,可以是简单的,也可以是困难的


例如,如果使用,则可以生成仅涵盖OpenGL-2.1符号和标记的头文件和编译单元。如果您随后使用此方法编译项目,编译器将在未涵盖的任何内容上出错。

如果您找到一个支持生成特定于版本的标题的扩展加载程序,如@datenwolf所述,这可能是最简单的解决方案。如果需要,您可以尝试其他选项

您可以在中找到的官方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
#定义GL_版本_3_0 1
#定义总帐版本3 1
#定义总账版本3\u 2 1
#定义总帐版本3 1
#定义总账版本4\u 0 1
#定义总帐版本4 1
#定义总帐版本4 1
#定义总账版本4\u 3 1
#定义总帐版本4 1
#定义总帐版本4和5 1
#包括
//你的代码
试试看。它是一个OpenGL包装库,完全支持您的要求:

以功能为中心的页眉设计

OpenGL API是迭代开发的,并以不同版本发布, 内部(对于API规范)命名特性。最新的 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程序可能看起来像 这:

如果代码编译比你可以确定它是OpenGL 3.2核心 顺从的使用尚未提供或依赖的功能 防止使用不推荐的功能

#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);
#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);