【问题标题】:The glGetString(GL_VERSION) does not match the requested versionglGetString(GL_VERSION) 与请求的版本不匹配
【发布时间】:2016-06-20 11:05:46
【问题描述】:

我试图了解 glGetString(GL_VERSION) 返回什么,因为我在使用这个函数时得到了奇怪的结果。这会返回我的 GPU 支持的最大 opengl 版本还是创建的当前上下文的 oepngl 版本。根据Which version does glGetString(GL_VERSION) get?,这将返回当前创建的上下文的 opengl 版本,但我认为情况并非如此。我想强制创建opengl context 3.1(向前兼容)、opengl context 2.0和opengl context 1.1。以下是我的观察

案例 1:使用 wglCreateContextAttribsARB 创建上下文。我认为它正在返回最高的 opengl 上下文版本 子案例1:

int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
    WGL_CONTEXT_MINOR_VERSION_ARB, 3,
    WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
    0
};
//glGetString(GL_VERSION) returns "4.3.0 - Build 10.18.14.4264"

子案例 2:

int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 3,
    WGL_CONTEXT_MINOR_VERSION_ARB, 1,
    WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
    0
};
//glGetString(GL_VERSION) returns "4.3.0 - Build 10.18.14.4264"

子案例 3:

int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 2,
    WGL_CONTEXT_MINOR_VERSION_ARB, 0,
    0
};
//glGetString(GL_VERSION) returns "4.3.0 - Build 10.18.14.4264"

子案例 4:

int attribs[] =
{
    WGL_CONTEXT_MAJOR_VERSION_ARB, 1,
    WGL_CONTEXT_MINOR_VERSION_ARB, 1,
    0
};
//glGetString(GL_VERSION) returns "4.3.0 - Build 10.18.14.4264"

案例2:使用glut创建opengl上下文

子案例 1:

glutInitContextVersion (3, 1);
glutInitContextFlags (GLUT_FORWARD_COMPATIBLE);
//glGetString(GL_VERSION) returns "3.1.0 - Build 10.18.14.4264"

子案例 2:

glutInitContextVersion (2, 0);
//glGetString(GL_VERSION) returns "4.3.0 - Build 10.18.14.4264"

子案例 3:

glutInitContextVersion (1, 1);
//glGetString(GL_VERSION) returns "4.3.0 - Build 10.18.14.4264"

谁能解释一下这种行为。我可以在创建上下文的地方发布完整的代码。 也有人可以指导我如何使用 glut 和 wglCreateContextAttribsARB 创建 opengl 3.1(前向兼容上下文)、opengl 2.0 上下文和 opengl 1.1 上下文?

【问题讨论】:

  • 我如何理解旧的 OpenGL 上下文 (
  • 但是当我将 wglCreateContextAttribsARB 与 3.1 前向兼容上下文的属性一起使用时,它仍然会打印“4.3.0 - Build 10.18.14.4264”。你所说的对opengl 2.0和opengl 1.1有意义。我还尝试为 opengl 3.3 创建核心上下文,但它仍然显示 opengl 版本 4.3。我已经更新了我的问题。请看一下
  • 我认为在情况 1 中您使用 wglCreateContextAttribs 错误。因为我看到 glut 正确地创建了 3.1。你能添加代码吗?
  • 是的,我在第一种情况下遇到了错误。所以我应该假设你在第一条评论中所说的是正确的。对于 3.0,它显示当前上下文版本。我希望我刚才写的正是你在评论中的意思。对吗?

标签: c++ opengl opengl-3


【解决方案1】:

glGetString(GL_VERSION) 返回当前上下文的版本。这通常是(但不总是)支持的最高版本。

原因在opengl规范中:

属性名称 WGL_CONTEXT_MAJOR_VERSION_ARB 和 WGL_CONTEXT_MINOR_VERSION_ARB 请求 OpenGL 上下文支持 API 的指定版本。如果成功,上下文 返回的必须与请求的上下文向后兼容。

然后继续说明,如果您请求低于 3.0 的版本,那么上下文可以是 3.2 或更高版本,前提是它们在兼容性配置文件中。它给你 4.3.0 只是因为它应该工作。

如果您请求 3.1,它还可以为您提供 3.2 之后的任何 GL 的核心版本。如果您请求 3.2 或更高版本,它还可以为您提供任何更高版本,前提是没有删除任何功能。据我所知,目前还没有。

https://www.opengl.org/registry/specs/ARB/wgl_create_context.txt

【讨论】:

  • 你所说的解释了事情。您能否提供您刚才提到的任何 opengl 规范的链接?
  • @PankajBansal:他确实给了你一个链接。在他的帖子底部。
  • @NicolBolas 我确实注意到了,但无法更改评论
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2020-08-12
  • 2021-10-16
  • 2019-01-25
相关资源
最近更新 更多