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

Aki*_*awa 7 c++ opengl version

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

因为我的计算机支持GL4.4,例如,即使我使用glGenVertexArrays()它,它也能成功运行.但glGenVertexArrays()仅适用于GL3 +.

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

Jan*_*egg 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 的过时部分,从而在目标 OpenGL 上下文中体现出兼容性(与弃用的 API)和核心(不带弃用的 API)使用。最重要的是,新的 API 概念被建议作为可能集成到未来版本中的扩展(通常是特定于供应商的)。所有这些导致您可以在程序中使用 OpenGL API 的许多可能的特定表现形式。

一项艰巨的任务是在您自己的 OpenGL 程序中遵守一组商定的功能(例如,如果您想为过去 4 年来发布的所有 Windows、macOS 和 Linux 进行开发,则使用 OpenGL 3.2 Core)。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);
Run Code Online (Sandbox Code Playgroud)

单功能 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);
Run Code Online (Sandbox Code Playgroud)

如果代码可以编译,那么您可以确定它符合 OpenGL 3.2 Core。防止使用尚不可用的功能或依赖已弃用的功能。