我正在尝试理解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上下文?
答案 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