我怎么知道我的系统支持哪个opengl版本

时间:2017-10-01 09:09:56

标签: opengl glfw

看看这个非常基本的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;

我不明白我如何“检测”我可以在行中设置的最大opengl版本:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);

此行不能放在glfwMakeContextCurrent之前:

glGetString(GL_VERSION)

所以我的问题是如何在程序开始时检测我的系统支持的opengl版本。

由于

2 个答案:

答案 0 :(得分:4)

请参阅GLFW guid - Window creation hints明确说明:

  

GLFW_CONTEXT_VERSION_MAJORGLFW_CONTEXT_VERSION_MINOR指定创建的上下文必须兼容的客户端API版本。这些提示的确切行为取决于所请求的客户端API。

  OpenGL:GLFW_CONTEXT_VERSION_MAJORGLFW_CONTEXT_VERSION_MINOR不是硬约束,但如果创建的上下文的OpenGL版本小于请求的上下文,则创建将失败。因此,对于遗留代码使用1.0版的默认值是完全安全的,并且在可用时仍然可以获得3.0版及更高版本的向后兼容上下文。

  虽然没有办法向驱动程序询问支持最高版本的上下文,但当您要求版本1.0上下文时,GLFW会尝试提供此内容,这是这些提示的默认值。


这意味着,如果您想获得尽可能高的OpenGL上下文,那么您可以完全跳过glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, )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将失败。


你问题的答案

  

我怎么知道我的系统支持哪个opengl版本?

是:

您必须首先创建一个OpenGL上下文,然后您可以通过glGetString(GL_VERSION)请求版本。


对答案的更正

正如评论中所提到的,当您尝试创建核心配置文件上下文时,此方法将失败

这意味着您无法使用:

glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

答案 1 :(得分:3)

实际上,尝试查询支持最高的GL版本是没用的。您应该只询问您的代码可以使用的最低 GL版本(以及最严格的配置文件),如果不可用,它无论如何都不会起作用。

如果您想选择性地支持某些功能,可以使用扩展机制。

如果你真的想在某些机器上使用更高版本的上下文,而在其他机器上需要更低的版本上下文,那么唯一可靠的方法是迭代尝试创建上下文,从最高版本的代码向后可以使用,最低,并在创建成功时停止。你不会以这种方式得到任何未知的新版本,但由于你的其余代码不会使用任何更新的功能,这是一个没有实际意义的点。

我可以看到为什么你可能想要一些“未知”更新的GL版本的唯一原因是库的情况,你创建上下文并且不知道要用它做什么 - 就像它的情况一样GLFW本身。但GLFW也有同样的问题。没有可靠的API来查询支持最高的GL版本。在@ Rabbid76的回答中提到的GLFW文档中的建议只会为您提供最高可用的旧版GL版本(在OSX上限制为2.1,在mesa / linux上限制为3.0)。它不适用于核心配置文件,但核心配置文件是在所有平台上获得现代化GL的唯一可靠方式。

说了这么多,我不得不承认我以前确实看过代码,实际上是迭代地尝试了上下文,但是从5.something开始,而在写这个答案的时候,最高的现有GL规格是4.6 。不确定他们在那里做了什么,也不知道在5.0失败之后他们开始使用的是哪个x。