glGetString(GL_VERSION)与请求的版本不匹配

时间:2016-06-20 11:05:47

标签: c++ opengl opengl-3

我正在尝试理解glGetString(GL_VERSION)返回的内容,因为当我使用此函数时,我得到了奇怪的结果。这是否返回GPU支持的最大opengl版本或创建的当前上下文的oepngl版本。根据{{​​3}},这会返回当前上下文创建的opengl版本,但我认为情况并非如此。我想强制创建opengl上下文3.1(前向兼容),opengl上下文2.0和opengl上下文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"

Subcase 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"

Subcase 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"

Subcase 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:使用过剩来创建opengl上下文

Subcase 1:

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

Subcase 2:

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

Subcase 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上下文?

1 个答案:

答案 0 :(得分:2)

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

原因在于opengl规范:

  

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

然后继续声明如果您请求低于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