我怎么知道我的系统支持哪个opengl版本
How can i know which opengl version is supported by my system
看看这个非常基本的 C++ 代码:
if(!glfwInit())
{
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
window = glfwCreateWindow(640, 480, "Test", NULL, NULL);
if (window==NULL)
{
return -1;
}
glfwMakeContextCurrent(window);
std::cout << "GL_VERSION: " << glGetString(GL_VERSION) << std::endl;
我不明白如何 "detect" 我可以在以下行中设置最大 opengl 版本:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
这一行不能放在glfwMakeContextCurrent
之前:
glGetString(GL_VERSION)
所以我的问题是如何在程序开始时检测我的系统支持的 opengl 版本。
谢谢
请参阅 GLFW guid - Window creation hints,其中清楚地写着:
GLFW_CONTEXT_VERSION_MAJOR
and GLFW_CONTEXT_VERSION_MINOR
specify the client API version that the created context must be compatible with. The exact behavior of these hints depend on the requested client API.
OpenGL: GLFW_CONTEXT_VERSION_MAJOR
and GLFW_CONTEXT_VERSION_MINOR
are not hard constraints, but creation will fail if the OpenGL version of the created context is less than the one requested. It is therefore perfectly safe to use the default of version 1.0 for legacy code and you will still get backwards-compatible contexts of version 3.0 and above when available.
While there is no way to ask the driver for a context of the highest supported version, GLFW will attempt to provide this when you ask for a version 1.0 context, which is the default for these hints.
这意味着,如果你想获得尽可能高的 OpenGL 上下文,那么你可以完全跳过 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, )
and glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, )
.
创建上下文后,您可以询问上下文版本,glGetString(GL_VERSION)
。
但是如果您的应用程序需要最低 OpenGL 版本,您需要将其告知 GLFW,并使用:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, required_major);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, required_minor);
如果无法满足要求,glfwCreateWindow
将失败。
您问题的答案
How can i know which opengl version is supported by my system?
是:
您必须先创建一个 OpenGL 上下文,然后您可以通过 glGetString(GL_VERSION)
请求版本。
更正答案
如评论中所述,当您尝试创建核心配置文件上下文时,此方法将失败。
这意味着您不能使用:
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
其实查询最高支持的GL版本是没有用的。您应该只要求您的代码可以使用的 lowest GL 版本(以及最严格的配置文件),如果该版本不可用,则无论如何都无法使用。
如果您想有选择地支持某些功能,使用扩展机制是可行的方法。
如果你真的想要在某些机器上使用更高版本的上下文,而在其他机器上使用更低版本的上下文,只有可靠的方法是迭代地尝试创建上下文,从您的代码可以使用的最高版本,最低版本,并在创建成功时停止。您不会通过这种方式获得任何未知的更新版本,但由于您的代码的其余部分不会使用任何更新的功能,因此这是一个有争议的问题。
我能理解您为什么想要一些 "unknown" 较新的 GL 版本的唯一原因是库的情况,您在其中创建上下文但不知道要用它做什么 - 比如GLFW 本身就是这种情况。但是 GLFW 也有同样的问题。根本没有可靠的 API 来查询支持的最高 GL 版本。 @Rabbid76 的回答中提到的 GLFW 文档中的建议只会为您提供最高可用的遗留 GL 版本(这将您限制为 OSX 上的 2.1 和 mesa/linux 上的 3.0)。它不适用于核心配置文件,但核心配置文件是在所有平台上获得现代 GL 的唯一可靠方法。
话虽如此,我不得不承认我之前确实看到过代码,它实际上反复尝试了上下文,但从 5.something 开始,而在撰写此答案时,现有的最高GL规格为4.6。不确定他们在那里尝试做什么,也不知道在 5.0 失败后 4.x 他们从哪个 x 开始。
看看这个非常基本的 C++ 代码:
if(!glfwInit())
{
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
window = glfwCreateWindow(640, 480, "Test", NULL, NULL);
if (window==NULL)
{
return -1;
}
glfwMakeContextCurrent(window);
std::cout << "GL_VERSION: " << glGetString(GL_VERSION) << std::endl;
我不明白如何 "detect" 我可以在以下行中设置最大 opengl 版本:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
这一行不能放在glfwMakeContextCurrent
之前:
glGetString(GL_VERSION)
所以我的问题是如何在程序开始时检测我的系统支持的 opengl 版本。
谢谢
请参阅 GLFW guid - Window creation hints,其中清楚地写着:
GLFW_CONTEXT_VERSION_MAJOR
andGLFW_CONTEXT_VERSION_MINOR
specify the client API version that the created context must be compatible with. The exact behavior of these hints depend on the requested client API.
OpenGL:GLFW_CONTEXT_VERSION_MAJOR
andGLFW_CONTEXT_VERSION_MINOR
are not hard constraints, but creation will fail if the OpenGL version of the created context is less than the one requested. It is therefore perfectly safe to use the default of version 1.0 for legacy code and you will still get backwards-compatible contexts of version 3.0 and above when available.
While there is no way to ask the driver for a context of the highest supported version, GLFW will attempt to provide this when you ask for a version 1.0 context, which is the default for these hints.
这意味着,如果你想获得尽可能高的 OpenGL 上下文,那么你可以完全跳过 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, )
and glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, )
.
创建上下文后,您可以询问上下文版本,glGetString(GL_VERSION)
。
但是如果您的应用程序需要最低 OpenGL 版本,您需要将其告知 GLFW,并使用:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, required_major);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, required_minor);
如果无法满足要求,glfwCreateWindow
将失败。
您问题的答案
How can i know which opengl version is supported by my system?
是:
您必须先创建一个 OpenGL 上下文,然后您可以通过 glGetString(GL_VERSION)
请求版本。
更正答案
如评论中所述,当您尝试创建核心配置文件上下文时,此方法将失败。
这意味着您不能使用:
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
其实查询最高支持的GL版本是没有用的。您应该只要求您的代码可以使用的 lowest GL 版本(以及最严格的配置文件),如果该版本不可用,则无论如何都无法使用。
如果您想有选择地支持某些功能,使用扩展机制是可行的方法。
如果你真的想要在某些机器上使用更高版本的上下文,而在其他机器上使用更低版本的上下文,只有可靠的方法是迭代地尝试创建上下文,从您的代码可以使用的最高版本,最低版本,并在创建成功时停止。您不会通过这种方式获得任何未知的更新版本,但由于您的代码的其余部分不会使用任何更新的功能,因此这是一个有争议的问题。
我能理解您为什么想要一些 "unknown" 较新的 GL 版本的唯一原因是库的情况,您在其中创建上下文但不知道要用它做什么 - 比如GLFW 本身就是这种情况。但是 GLFW 也有同样的问题。根本没有可靠的 API 来查询支持的最高 GL 版本。 @Rabbid76 的回答中提到的 GLFW 文档中的建议只会为您提供最高可用的遗留 GL 版本(这将您限制为 OSX 上的 2.1 和 mesa/linux 上的 3.0)。它不适用于核心配置文件,但核心配置文件是在所有平台上获得现代 GL 的唯一可靠方法。
话虽如此,我不得不承认我之前确实看到过代码,它实际上反复尝试了上下文,但从 5.something 开始,而在撰写此答案时,现有的最高GL规格为4.6。不确定他们在那里尝试做什么,也不知道在 5.0 失败后 4.x 他们从哪个 x 开始。