C++ 为什么我不能获得与GLFW兼容的OpenGL上下文?
据我所知,当我在GLFW上设置这些上下文约束时:C++ 为什么我不能获得与GLFW兼容的OpenGL上下文?,c++,opengl,glfw,glew,C++,Opengl,Glfw,Glew,据我所知,当我在GLFW上设置这些上下文约束时: glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); 我应该在运行的机器上获得最大
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
我应该在运行的机器上获得最大可用的OpenGL上下文,前提是它高于OpenGL 3.3。然而,通过使用glGetString获取OpenGL上下文版本,我发现情况并非如此。每次我查询glGetString的上下文版本,我只会得到我用glfwWindowHint设置的主版本和次版本,上面什么都没有。请记住,我的GPU支持OpenGL4.5
另一件需要注意的事情是,当我没有设置任何约束时,我实际上得到了一个OpenGL4.5上下文
以下是完整的源代码,它似乎复制了这个问题:
#define GLEW_STATIC
#include <iostream>
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <glm\glm.hpp>
int main(int argc, char argv[])
{
if (!glfwInit())
{
std::cerr << "Failed to initialize GLFW 3.0.4" << std::endl;
getchar();
glfwTerminate();
return -1;
}
std::cout << "Initialized GLFW 3.0.4" << std::endl;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
GLFWwindow* m_window = glfwCreateWindow(640, 480, "Koala", NULL, NULL);
if (!m_window)
{
std::cerr << "Failed to create OpenGL 3.3+ context" << std::endl;
getchar();
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(m_window);
std::cout << "Created OpenGL 3.3+ context" << std::endl;
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK)
{
std::cerr << "Failed to initialize GLEW 1.11.0" << std::endl;
getchar();
glfwTerminate();
return -1;
}
std::cout << "Initialized GLEW 1.11.0" << std::endl;
const GLubyte* renderer = glGetString(GL_RENDERER);
const GLubyte* version = glGetString(GL_VERSION);
std::cout << "GPU: " << renderer << std::endl;
std::cout << "OpenGL Version: " << version << std::endl;
while (!glfwWindowShouldClose(m_window))
{
glfwSwapBuffers(m_window);
glfwPollEvents();
}
glfwTerminate();
return 0;
}
我应该在运行的机器上获得最大可用的OpenGL上下文,前提是它高于OpenGL 3.3
这不是它的定义。从:
GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR提示指定创建的上下文必须与之兼容的客户端API版本
对于OpenGL,这些提示不是硬约束,因为它们不必精确匹配,但如果生成的OpenGL版本低于请求的版本,glfwCreateWindow仍将失败
虽然无法向驱动程序请求支持的最高版本的上下文,但大多数驱动程序在向GLFW请求版本1.0上下文时都会提供此信息
所以大多数司机都会给你你想要的,但这不是保证
典型的用法是指定支持代码使用的所有功能的最低版本。那么你就不在乎你是否得到了那个版本,或者更高的版本。但是您知道,如果不支持最低版本,您将失败
如果要动态测试支持哪个版本,最好的办法可能是首先指定可以利用的最高版本,然后测试glfwCreateWindow的返回值。如果失败,只要失败就降低版本,然后再次调用glfwCreateWindow,直到达到可以运行的最低版本。然后,您可以跟踪哪个版本成功,或者glGetStringGL_version报告的版本,并使用该版本在运行时决定可以使用哪些功能
我应该在运行的机器上获得最大可用的OpenGL上下文,前提是它高于OpenGL 3.3
这不是它的定义。从:
GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR提示指定创建的上下文必须与之兼容的客户端API版本
对于OpenGL,这些提示不是硬约束,因为它们不必精确匹配,但如果生成的OpenGL版本低于请求的版本,glfwCreateWindow仍将失败
虽然无法向驱动程序请求支持的最高版本的上下文,但大多数驱动程序在向GLFW请求版本1.0上下文时都会提供此信息
所以大多数司机都会给你你想要的,但这不是保证
典型的用法是指定支持代码使用的所有功能的最低版本。那么你就不在乎你是否得到了那个版本,或者更高的版本。但是您知道,如果不支持最低版本,您将失败
如果要动态测试支持哪个版本,最好的办法可能是首先指定可以利用的最高版本,然后测试glfwCreateWindow的返回值。如果失败,只要失败就降低版本,然后再次调用glfwCreateWindow,直到达到可以运行的最低版本。然后,您可以跟踪哪个版本成功,或者glGetStringGL\u版本报告的版本,并使用该版本在运行时决定可以使用哪些功能。您是否尝试过其他配置文件,如GLFW\u OPENGL\u any\u配置文件或GLFW\u OPENGL\u COMPAT\u配置文件?@JoachimPileborg将其设置为GLFW\u OPENGL\u COMPAT\u配置文件似乎已经修复了它,但是为什么呢?这两种方式都应该有效,而且,我想要一个核心配置文件。有没有办法获得最大的核心配置文件?为什么要获得最高支持版本?如果他们后来删除了你的代码使用的函数呢?你是否尝试过其他配置文件,如GLFW_OPENGL_any_profile或GLFW_OPENGL_COMPAT_profile?JoachimPileborg将此设置为GLFW_OPENGL_COMPAT_profile似乎已经修复了它,但为什么?这两种方式都应该有效,而且,我想要一个核心配置文件。有没有办法获得最大的核心配置文件?为什么要获得最高支持版本?如果他们以后删除了代码使用的函数,该怎么办?