我想确保我的应用程序符合OpenGL 2.1。 我怎么检查这个?
因为我的电脑支持GL4.4,即使我使用glGenVertexArrays()
,它也能成功运行。但glGenVertexArrays()
仅适用于GL3 +。
所以,我想验证我的应用程序仅使用GL2.1功能。 一种方法是在我只支持GL2.1的旧PC上运行它,但我正在寻找一种更简单的方法。
答案 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 兼容。使用尚不可用或依赖的功能 不推荐使用已弃用的功能。