看看这个非常基本的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版本。
由于
答案 0 :(得分:4)
请参阅GLFW guid - Window creation hints明确说明:
GLFW_CONTEXT_VERSION_MAJOR
和GLFW_CONTEXT_VERSION_MINOR
指定创建的上下文必须兼容的客户端API版本。这些提示的确切行为取决于所请求的客户端API。
OpenGL:GLFW_CONTEXT_VERSION_MAJOR
和GLFW_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。