Noo*_*ble 0 c++ opengl glew glfw
据我所知,当我在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);
Run Code Online (Sandbox Code Playgroud)
我应该在运行的机器上获得最大可用的OpenGL上下文,前提是它高于OpenGL 3.3.但是,通过使用glGetString获取OpenGL上下文版本,我发现情况并非如此.每次我查询glGetString上下文版本时,我只会得到我设置的主要和次要版本glfwWindowHint,上面没有.请记住,我的GPU支持OpenGL 4.5.
另外需要注意的是,当我没有设置任何约束时,我确实得到了一个OpenGL 4.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;
}
Run Code Online (Sandbox Code Playgroud)
我应该在运行的机器上获得最大可用的OpenGL上下文,前提是它高于OpenGL 3.3.
这不是它的定义方式.从GLFW文档:
GLFW_CONTEXT_VERSION_MAJOR和GLFW_CONTEXT_VERSION_MINOR提示指定了创建的上下文必须兼容的客户端API版本.
对于OpenGL,这些提示不是硬约束,因为它们不必完全匹配,但如果生成的OpenGL版本小于请求的版本,则glfwCreateWindow仍将失败.
虽然没有办法向驱动程序询问支持最高版本的上下文,但是当您向GLFW询问版本1.0上下文时,大多数驱动程序都提供此功能.
所以"大多数司机"会给你你所期望的,但这不能保证.
典型用法是指定支持代码使用的所有功能的最低版本.那么你不在乎你是否得到了那个版本,或者可能更高版本.但是您知道如果不支持最低版本,您将会失败.
如果您想动态测试支持哪个版本,最好的办法是首先指定您可以利用的最高版本,并测试其返回值glfwCreateWindow().如果失败,只要失败就减少版本,然后glfwCreateWindow()再次调用,直到达到可以运行的最低版本.然后,您可以跟踪哪个版本成功,或者报告的版本glGetString(GL_VERSION),并使用它来确定运行时可以使用哪些功能.