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;
}
问题是,此枚举器GL_CONTEXT_PROFILE_MASK
显然在某些OpenGL版本中不可用,例如2.1,这会导致错误。
我的问题是 - 如何检查没有GL_CONTEXT_PROFILE_MASK的OpenGL版本的配置文件?另外,如果有人可以将首次引入此配置文件掩码的文档指向,我会发现它非常有用。显然,OpenGL 4.xx关于GlgetIntegerv的
如何进行配置文件检查没有GL_CONTEXT_PROFILE_MASK的OpenGL版本?确切地说,OpenGL直到版本3.2才有配置文件的概念,因为以前的大多数版本(最多2.1)是向后兼容的。当OpenGL 3.0引入不建议的功能时,这已成为一个问题,而OpenGL 3.1刚刚从规范中删除了一些功能。但是,不同的供应商不断通过扩展来支持向后兼容性,并且您同时存在不同版本的OpenGL规范。为了区分它们,引入了配置文件,但仅在版本3.2中引入。 对您的问题的最正确答案是,在OpenGL 3.2之前不存在配置文件,并且从技术上讲没有配置文件。但是,如果我们将这个问题归结为如何表达较旧的OpenGL版本中的二分法,那么答案将如下:
opengl3.0
-尽管贬低了许多遗产功能,但它们仍然工作为3.0,因此
预先效力3.0是兼容性概况,除了一个例外 - 如果有GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
opengl3.1-
文档说明了此版本如果在扩展字符串中存在GL_ARB_compatibility
opengl3.2和newer-使用
GL_CONTEXT_PROFILE_MASK
.提供此信息。
实面代码看起来像这样(对不起,详细的OpenGL版本实用程序功能,但它们在这里很方便):
constexpr GLint GLV(GLint major, GLint minor) {
constexpr auto majorShift = std::numeric_limits<GLint>::digits / 2 - 1;
return (major << majorShift) | minor;
}
GLint glVersion() {
constexpr auto invalid_version = -1;
const auto glVersionString{ reinterpret_cast<const char*>(glGetString(GL_VERSION)) };
GLint major;
const auto majorResult = std::from_chars(glVersionString, glVersionString + 1, major).ec;
if (majorResult == std::errc::invalid_argument) {
return invalid_version;
}
GLint minor;
const auto minorResult = std::from_chars(glVersionString + 2, glVersionString + 3, minor).ec;
if (minorResult == std::errc::invalid_argument) {
return invalid_version;
}
return GLV(major, minor);
}
void reportGLProfile() {
const auto glV = glVersion();
if (glV <= GLV(2, 1)) {
std::cout << "Compatibility profile" << std::endl;
} else if (glV == GLV(3, 0)) {
GLint flags;
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
if (flags & GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT) {
std::cout << "Core profile" << std::endl;
} else {
std::cout << "Compatibility profile" << std::endl;
}
} else if (glV == GLV(3, 1)) {
GLint extensionsNum;
glGetIntegerv(GL_NUM_EXTENSIONS, &extensionsNum);
while (extensionsNum--) {
const auto extensionName = reinterpret_cast<const char *>(glGetStringi(GL_EXTENSIONS, extensionsNum));
if (std::strcmp(extensionName, "GL_ARB_compatibility") == 0) {
std::cout << "Compatibility profile" << std::endl;
return;
}
}
std::cout << "Core profile" << std::endl;
} else {
GLint profile;
glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
if (const auto errorCode = glGetError()) {
std::cout << "Pending GL error while obtaining profile: " << errorCode << std::endl;
return;
}
if (profile & GL_CONTEXT_CORE_PROFILE_BIT) {
std::cout << "Core profile" << std::endl;
} else {
std::cout << "Compatibility profile" << std::endl;
}
}
}
文档:
上下文创建的3.0形式没有配置文件的概念。只有一种形式的OpenGL:核心规范。在3.2中,OpenGL有效地分为两个配置文件,即核心和兼容性。仅需要定义核心才需要实现,因此不能保证可用的兼容性。