我正在尝试检测使用glfw创建的默认OpenGL上下文的配置文件。这就是我实现它的方式(基于wiki page)
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版本进行配置文件检查?此外,如果有人能给我指点一下最初介绍这种个人资料面膜的文档,我会发现它非常有用。显然,doc for OpenGL 4.xx about glGetIntegerv甚至没有提到个人资料面具,这让我感到困惑。
1条答案
按热度按时间cbjzeqam1#
如何对没有GL_CONTEXT_PROFILE_MASK的OpenGL版本进行配置文件检查?
准确地说,OpenGL直到3.2版才有配置文件的概念,因为之前的大多数版本(直到2.1)都是向后兼容的。当OpenGL 3.0引入了过时的功能,而OpenGL 3.1刚刚从规范中删除了一些功能时,这就成了一个问题。然而,不同的供应商一直通过扩展来支持向后兼容,并且同时存在不同版本的OpenGL规范。为了区分它们,引入了概要文件,但仅在3.2版中引入。
对你的问题最正确的回答是,在OpenGL 3.2之前,配置文件不存在,从技术上讲,没有配置文件。然而,如果我们将这个问题归结为如何在旧的OpenGL版本中表示配置文件二分法,那么答案将如下所示:
GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT
,则意味着3.0模拟3.1体验,其中向后兼容性被移除,从而成为其核心配置文件。GL_ARB_compatibility
,则支持所有不推荐使用的函数,因此可以将其视为兼容性(否则视为核心)GL_CONTEXT_PROFILE_MASK
提供此信息实际代码应该如下所示(对于冗长的OpenGL版本实用程序函数,很抱歉,但它们在这里很方便)
如果有人能给我指点一下最初引入这种轮廓面具的文档,我会发现它非常有用
这在上下文类型文档中有所涉及:
环境创建的3.0形式没有配置文件的概念。OpenGL只有一种形式:核心规范。在3.2版本中,OpenGL实际上被分成了两个概要:核心和兼容性。实现只需要定义核心,因此不能保证兼容性可用