如何检查OpenGL版本一致性

How to check for OpenGL version conformance?

本文关键字:OpenGL 版本 一致性 检查 何检查      更新时间:2023-10-16

我想确保我的应用程序符合OpenGL 2.1。我该如何检查?

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

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

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

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

...
#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

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

以功能为中心的标题设计

OpenGL API是迭代开发的,并以版本发布,内部(对于API规范)命名为功能。最新OpenGL的功能/版本为4.5。以前的版本是1.0、1.1、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核心顺从的使用尚未可用或依赖的功能阻止了不推荐使用的功能。

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

例如,如果使用glloadgen OpenGL加载程序生成器,则可以生成一个头文件和编译单元,该头文件和汇编单元将仅完全覆盖OpenGL-2.1符号和标记。如果你用这个编译你的项目,编译器会在任何没有涵盖的地方出错。