如何检查OpenGL版本一致性
How to check for OpenGL version conformance?
我想确保我的应用程序符合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符号和标记。如果你用这个编译你的项目,编译器会在任何没有涵盖的地方出错。
- 在上下文初始化之前查询支持的最高 OpenGL 版本?
- 从版本字符串中提取 OpenGL 版本
- OpenGL 版本不等于支持的着色器版本
- CEGUI:无法获取桌面 OpenGL 版本
- 使用 C# 获取 OpenGL 版本的最简单方法
- Mac上的OpenGL版本
- 使用 SDL2 指定 OpenGL 版本
- 使用 OpenGL 版本 3+ 呈现文本/UI
- 为什么我不能在这个虚假的OpenGL上下文中检查OpenGL版本
- OS X 上的 OpenGL 版本支持
- 如何设置 OpenGL 版本
- 无法在 QGLWidget 中设置所需的 OpenGL 版本
- OpenGL 版本在 ContextAttribs() 值更改时更改
- OpenGL 版本未打印
- OpenGL 版本在使用 ifstream 时太低
- OpenGL 版本问题
- OpenGL版本和编程
- 在openGL(版本>3.3)的屏幕上显示纹理时如何更改纹理的大小?
- OpenGL版本(截至2014年底)
- 如何检查OpenGL版本一致性