OpenGL 3.2之前版本上下文配置文件检测及掩码文档查询
OpenGL上下文配置文件检测问题解答
问题背景
你尝试检测GLFW创建的默认OpenGL上下文配置文件,基于Khronos Wiki实现了对应代码,但发现GL_CONTEXT_PROFILE_MASK枚举在OpenGL 3.2之前的版本(如2.1)中不可用,会引发错误。
你的检测代码:
std::string openGLProfile(){ // Prints the profile of the current context GLint profile = 0; glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile); bool core_profile = profile & GL_CONTEXT_CORE_PROFILE_BIT; bool compatibility_profile = profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT; std::string str = "No profile"; if (core_profile == true) str = "Core profile"; else if (compatibility_profile == true) str = "Compatibility"; std::cout << str; }
1. OpenGL 3.2之前版本的配置文件检测
OpenGL 3.2是首次引入Core Profile和Compatibility Profile概念的版本。在3.2之前的OpenGL版本(如2.1、1.x)中,根本不存在这两种配置文件的区分——所有上下文都是传统的兼容模式,包含全部旧版特性。
针对这类旧版本,你不需要调用GL_CONTEXT_PROFILE_MASK,直接判定为传统兼容模式即可。优化后的兼容代码可先获取当前OpenGL版本号,再分支处理:
#include <string> #include <sstream> #include <iostream> std::string openGLProfile(){ // 获取OpenGL版本字符串 const GLubyte* versionStr = glGetString(GL_VERSION); std::string version( reinterpret_cast<const char*>(versionStr) ); // 解析主版本号 int majorVersion = 0; std::istringstream iss(version); iss >> majorVersion; std::string str; if (majorVersion < 3 || (majorVersion == 3 && (version.find("3.0") != std::string::npos || version.find("3.1") != std::string::npos))) { // 3.2之前的版本,无Core/Compatibility区分 str = "Legacy profile (no Core/Compatibility distinction)"; } else { // 3.2及以上版本,使用掩码检测 GLint profile = 0; glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile); bool core_profile = profile & GL_CONTEXT_CORE_PROFILE_BIT; bool compatibility_profile = profile & GL_CONTEXT_COMPATIBILITY_PROFILE_BIT; if (core_profile) str = "Core profile"; else if (compatibility_profile) str = "Compatibility profile"; else str = "No recognized profile"; } std::cout << str; return str; }
2. GL_CONTEXT_PROFILE_MASK的文档相关说明
- 首次引入位置:
GL_CONTEXT_PROFILE_MASK是在OpenGL 3.2核心规范中首次定义的,属于上下文创建与属性查询范畴,具体出现在规范的「Context Creation」章节的上下文属性部分。 - 4.x文档未提及的原因:OpenGL 4.x的
glGetIntegerv主文档未重复列出该枚举,是因为它属于版本特定的上下文属性,而非通用全局状态查询枚举。实际上,该枚举在3.2及以后的所有OpenGL版本(包括4.x)中均有效,只是文档组织时将这类上下文相关枚举归类到上下文管理章节,而非glGetIntegerv的参数列表中。
内容的提问来源于stack exchange,提问作者MarsaPalas
相关产品推荐
相关产品推荐

