我正在尝试检测使用

问题描述 投票:0回答: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; }

问题是,此枚举器GL_CONTEXT_PROFILE_MASK显然在某些OpenGL版本中不可用,例如2.1,这会导致错误。 我的问题是 - 如何检查没有GL_CONTEXT_PROFILE_MASK的OpenGL版本的配置文件?另外,如果有人可以将首次引入此配置文件掩码的文档指向,我会发现它非常有用。显然,OpenGL 4.xx关于GlgetIntegerv

doc甚至没有提及掩模,这使我感到困惑。
	

如何进行配置文件检查没有GL_CONTEXT_PROFILE_MASK的OpenGL版本?
确切地说,OpenGL直到版本3.2才有配置文件的概念,因为以前的大多数版本(最多2.1)是向后兼容的。当OpenGL 3.0引入不建议的功能时,这已成为一个问题,而OpenGL 3.1刚刚从规范中删除了一些功能。但是,不同的供应商不断通过扩展来支持向后兼容性,并且您同时存在不同版本的OpenGL规范。为了区分它们,引入了配置文件,但仅在版本3.2中引入。

对您的问题的最正确答案是,在OpenGL 3.2之前不存在配置文件,并且从技术上讲没有配置文件。但是,如果我们将这个问题归结为如何表达较旧的OpenGL版本中的二分法,那么答案将如下:

c++ opengl compatibility profile
1个回答
2
投票
-仅支持兼容性配置文件(所有上下文都是向后兼容的)。

opengl3.0

-尽管贬低了许多遗产功能,但它们仍然工作为3.0,因此

预先效力3.0是兼容性概况,除了一个例外 - 如果有

GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT

,则表示3.0模拟3.1经验,在此中,在后面的兼容性中,被删除,因此是核心配置文件。
  • 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; } } }

    如果有人可以将我首次引入此配置文件掩码的文档指出,我会发现它非常有用

  • 被Context类型覆盖了

    文档:

    上下文创建的3.0形式没有配置文件的概念。只有一种形式的OpenGL:核心规范。在3.2中,OpenGL有效地分为两个配置文件,即核心和兼容性。仅需要定义核心才需要实现,因此不能保证可用的兼容性。
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.